**************************************************************************** Information Screens Upgrade **************************************************************************** For the next upgrade I will be doing fancy screen manipulation in order to achieve smooth scrolling AND to be able to utilize a wide range of different screens which will all use the exact same chunk of memory. This will allow the game to use a minimum amount of chipram and avoid memory fragmentation from constantly opening and closing screens. Using clever arrangement of the screen memory, we will be able to display e.g. 3 screens at once which will trash the display of all the other screens, but as those other screens won't be visible, noone will ever know. When switching back to the original display, the previous 3 screen display will be trashed, but as it will no longer be visible, nobody will ever know. Using this technique we can have a dozen different screens open at once, all using overlapping chipram. It will simply be a matter of pushing the correct screens to the front and using them to generate the proper display. In order for this technique to work, the screens must be in interleaved format because interleaved format utilizes memory more efficiently. Also, interleaved screens allow general blitter operations to be faster so hopefully all those DrawImage() calls will be a bit faster. Pointers: ------------------------------------------------------------------------- Display1: NormalDisplay 320x256x6 main screen + 640x256x3 hires screen. 61440 bytes + 61440 bytes = 122880 bytes total Base=HiResScreen Base+ 61440 LoResScreen. (main map) ------------------------------------------------------------------------- Display2: ScrollPanel1Display: 640x1024x4 autoscroll screen + 320x32x6 screen to display the icon. 327680 bytes + 7680 bytes = 335360 bytes. Base+7680=SP1SmallLoResScreen (320x32x6) (7680 bytes) Base+7680+7680=SP1HiResAutoScrollScreen(640x1024x4) (327680 bytes) ------------------------------------------------------------------------- Create various other displays here... Base+7680 = LoresScreen on standard info panel. Base+7680+whatever = HiResScreen on standard info panel. Base+7680+whatever+whatever= HiResScrollingScreen on standard info panel. * 1: Change all screens to Interleaved. Make neccessary JC-code adjustments to open and setup the screens in interleaved mode. DONE. * 2: Change lores screen to be 64 colors and the shadowboard too. This prepares for the final and ultimate ECS version. DONE. Hmmm.. the quadrascopes are now slower. * 3: Adjust asm testpixel code to work with interleaved bitmaps and 64 colors. TestPixel4_320 is now TestPixel5_320 and it only works on Interleaved BitMaps with 6 bitplanes. TestPixel1_320 now only works on Interleaved Bitmaps of 6 bitplanes. ALL DONE. YIKERS! 64 color mode drains so much DMA time from the chipram that now if you move the mouse on the New Game? or End Turn? screens the gfx slow down dramatically! Perhaps these should be redone on 32 color screens for speed? * 4: Adjust asm DoTheHighlighting and UnDoTheHighlighting to work with the new 64 color interleaved screens. DONE. WOW! Pressing "l" for line of sight still goes at a nice fast speed even though it is testing an extra bitplane now and even though the available bandwidth for testing chipram has been cut in half. * 5: 64-bit aligned the double-buffering of the rotating pentagrams. DONE. * 6: REMOVED all that conditional OS 1.2 / 1.3 code from info.c. Display3: ScrollPanel2Display: same old way for now. Display4: FileRequesterScreen. Noninterleaved. For Loading and Saving. * 7: Allocate the screenmem as 1 big chunk then subdivide it in an overlapping manner for the various displays and screens. A. Allocate 1 chunk of 343040+4 bytes of chipram. (This is the largest chunk currently needed) 640x1024x4 + 7680+7680 DONE. B. Setup the bitmap pointers appropriately. DONE. C. Open up the 2 new screens. Put the 2 new ones in back for now. DONE D. Open the appropriate window on each screen. DONE. * 8. Install TypeSmith 2.5b. DONE. Ok, TypeSmith is really awesome because it can load and edit PostScript, Compugraphic, TrueType and Amiga Bitmap fonts! However, there is no way to see how the chars will actually look in their normal size while you are editing them so I had to use Deluxe Paint 5 and keep switching screens back and forth. It worked ok. It is clear that TypeSmith was designed to edit scalable fonts rather than bitmap fonts. I needed a break from programming so I stayed up all night designing a bitmap script font that looks really GREAT! Unbelievably, there is no way to change the width of a bitmap character from within TypeSmith so I wrote my very first Arexx program! WOW! Arexx is totally kewl! The Arexx port on TypeSmith is very nice. I made a script in 8 minutes (including the time to look up the commands in the online help) that allows me to change the width of chars. It even worked perfectly on the first try! I was going to make the ChaosCalligraphy font be 44 points tall for use on the scroll info panels. This looks AMAZINGLY FANTABULOUS, but then I realized this would be too big for use on the standard info panels so I squished it down to 40 points so now it could theoretically be used on the standard info panels also. The 40 point font doesn't look as awesome as 44 but it still looks ok. * 9. Design Awesome Calligraphy Font: ChaosCalligraphy.font/40 9356 bytes DONE. *10. Implement new ScrollDisplayPanel1 A. Correctly position the screens and print text to them using the same old font as always in order to test the AUTOSCROLLing. Ok, I have now wasted quite a few hours trying to get AUTOSCROLLing to work. The docs don't fully explain it. I finally figured it out after much trial and error. I now know how AUTOSCROLL works HOWEVER it is useless on a child screen because the scrolling is somehow constrained by the parent screen! Grrr.. I consider this to be a bug in the OS. AUTOSCROLLING isn't really required. But opening a LARGE screen which can be manually scrolled IS required. In each test where AUTOSCROLLING failed, manual scrolling failed also. So here are my options for making the AUTOSCROLL ScrollInformationPanel work: 1) Don't attach it to the parent screen. Then it works. The trouble is then there are 2 open screens in the system and that annoys people. 2) Do #1 but build in some amiga-m/n detection code into Chaos so that we automatically depth arranged BOTH screens at once. The trouble with this idea is #1: I don't know how to do it and #2 I doubt if it would even work. 3) Try to open the parent screen with fake higher top so that it can move up higher. Thus the child screen will also be able to move higher. The trouble with this idea is I don't think you can just go around opening screens with fake tops. I would try this idea except for 1 MAJOR problem: when the parent screen becomes AUTOSCROLL in the future, having a fake top means it will AUTOSCROLL incorrectly! grrr. 4) Figure out some way to poke into the screen->viewport or whatever and force this to work by making it not be a child screen anymore or by changing the clip in the viewport or something?? I TRIED THIS AND IT DIDN'T WORK. 8( 5) Make the SP1HiResAutoScrollScreen be the parent screen. If its the parent it should be able to AUTOSCROLL. The problem with this is that I don't think it will work because all the other child nondraggable screens will constrain it from scrolling off the top. 6) Constantly keep reopening and closing the scroll screens. It takes 25 frames (half a second) to open the 640x1024x4 screen and window. It takes 34 frames to open that screen/window + the SmallLoRes Screen and Window. This is entirely too long to wait. 7) Open 2 child screens of 640x512 each and flip between them when moving the mouse or pressing an arrow key. 8) Somehow use ScrollVPort() to do the scrolling on the 640x1024 child screen. The problem with this is that experience has shown ScrollVPort to NOT BE FAST ENOUGH. AUTOSCROLL is PERFECTLY smooth and so is MoveScreen() but ScrollVPort() is screwed up. 9) Temporarily make SP1HiResAutoScrollScreen be the parent screen. This should allow it to autoscroll correctly. Then later on when the map becomes an AUTOSCROLL screen and the 2 screens conflict with each other, I'll just make the 2 SP1 screens into their own separate family. Thus there will then be 2 open screens in the system at that point. This might also necessitate making the HiResScreen be DRAGGABLE again. Hmmm... DONE. * NEW FUNCTION: RedrawRightHandSide() to redraw whatever needs to be redrawn on the right hand side of the map screen. (spell list or gadgets or whatever. DONE. B. Adjust colors. DONE. C. Implement Stefan Burstroem's FastTextFit.asm into the makefile. The only problem is there are no docs for the routine! I eliminated the TextExtent parameter since it was not used. DONE. * BUG: the FastTextFit asm code has a bug so that it usually returns 1 higher than the correct result. NOW FIXED. D. Implement new 40 pt. calligraphy font on the new Scroll Info Panel. DONE. E. Rewrite the PRTPool() function so that the entire text is decompressed all at once into a buffer then that buffer must be processed using FastTextFit() to fit the text onto the screen 1 line at a time. I ended up completely rewriting printer.c. DONE. F. I had to change PRT_WIDTH to be 1025 DONE. G. Since I am rewriting printer.c I have converted it to JC. DONE. * BUG! My pearl.font TextAttr was using FPB_DISKFONT instead of the correct FPF_DISKFONT! This explains why the pearl.font never worked on my OS 1.3 Amiga 2000 and why it never seemed to work on my dad's A500 or A3000. Using FPB_DISKFONT is equivalent to FPF_ROMFONT so it APPEARED to work on my computer because my preferences are set to use pearl.font as the default system font. This means that NOBODY has been seeing the correct font all this time except for me! ARRRGGHH!!! NOW FIXED. * December 16th: First panel of the new scroll display is finally ALL DONE. Most spell descriptions fit onto 1 screen with the small 40 point font so the AUTOSCROLLing is not usually used. *11. Implement new ScrollDisplayPanel2 Hmmm.... How should I do this? A. Have another screen which is only 640x512 and display the info on that screen? B. Simply erase the autoscroll screen and display the data on it? C. Simply erase the bottom half of the autoscroll screen and display the data on the bottom half and smooth scroll it up? ARRGH I can never decide how to do these things! I guess I'll just do option A. DONE. * Utilized some trickery to stop the ScrollPanel1 from scrolling when there is only 1 screen of text. DONE. * Implement Anti-Aliased, Anti-Flicker text. Technically this is anti-flicker text, but it also partially antialiases too. DONE. * TOO SLOW: On my 25 Mhz 68030 it takes 65 frames to bring up the description of the Cobra. I added in some Mask stuff and rearranged the colors but it still takes 44 frames. It takes 5 frames to decompress the text, the other 39 frames are displaying the text in the dead slowest graphics mode of ECS. If anyone complains about it being to slow I can do one or more of the following: Use the fake 1 bitplane screen. Add an extra pixel between lines and use the BltBitMap() technique. Change to noninterleaved and write an asm routine to zap the text up real fast. Switch down to 8 colors? Design the font as a colorfont. Design the font as 2 fonts. 1 is the normal font an the other is just the antialiasing. Try a minterm of 0x77 or 0xEE I at least need to do the fake screen thing between SP1 and SP2 to cover up the sloppiness + speed it up greatly! * IMPLEMENTED: fake 1bpl screen at beginning of SP1 and again between SP1 and SP2. Damn it still takes 21 frames for the Cobra description. 35 frames for gooey blob! * DISABLED CLIPPING: during the text printing only. NO EFFECT. 8( * Tried JAM2 mode: NO EFFECT. 8( I could do this: Text() the text to a seperate bitmap buffer. move.l (bitmapbuffer)+,d0 move.l d0, (FastRamBufferbpl1Y+1)+ or.l d0, (FastRamBufferbplY-1)+ That simple loop will generate the antialiasing. move.l d0,(FastRamBufferbpl2Y)+ ; to copy the main text also. Then just copy the bitplanes to the appropriate planes of the screen and that is all. Maybe I'll do something like this someday. But I'll probably never get around to it. It doesn't apply to gfx cards. * NEW POWERUPS shown on Info Screen: Crystal Ball, Ubiquiscope, Seismology, Cartography, Telescope, Alternography, Fly, Earthbind, Archery, Nonarchery, Lich/Convert/Materialize/Undead/NotUndead, Sword of Sassenrath, Mount, NoMount, NoGrow, StoneToFlesh, Inanimorphobiosis, FleshToStone. I intentionally left out Cursed Sword because its graphic currently looks identical to a regular Magic Sword. * PROBLEM: If the game locks up we can't just press CTRL-C to break into the program. I have now set it so CTRL-C will work in the developer version. DONE. hmmm... doesn't seem to have any effect. *12. Implement new InfoPanelDisplay1 IF -i option (InterlaceMode) is set have it in interlace else have it in non interlace, the old way. In other words leave the existing info panel 1 code intact. Just add in an IF (InterlaceMode) InformationPanelInterlace(); return; InformationPanelInterlace() will call the InformationPanelInterlace1(); A. Open 2 new interlace screens with windows. DONE. *13. Implement new InfoPanelDisplay2 DONE. *14. Implement Antialiased text on the new IP1 displays DONE. (this requires a minimum of 16 colors) *15. Implement antialiased bargraph boxes to reduce flicker on 1084S monitors. DONE. *16. Implement color cycling on the new IP1 displays. Oops color clash. The original color cycling worked by cycling HIRESGREEN2, but this color is being used to display the owner. Ok I will use HALFHIRESBLACK and HALFHIRESGREEN1 for the color cycling colors. Or I might create yet another screen so that the creature name + owner can have its own 16 color pallette on ECS. Or its own 256 color pallette or whatever on AGA. COLOR CYCLING DONE. *17. Redo the halfIP1HiResColors to be halfway between the new darkblue background and the real color to reduce flicker. DONE. * PROBLEM: the cyan rectangular boxes flicker quite badly on a 1084S monitor even when antialiased. Solution: draw the rectangles in a darker color. DONE, but it strangely doesn't seem to reduce the flicker any. Its very difficult to keep long narrow horizontal lines from flickering in interlace. *18. ReImplement Level Editor into the new IP1 displays. DONE. * There is a hashing problem. I need to make it so that when scrollpanel exits, clear the whole sp1 display instead of just the map display. DONE. *19. Fix level editing the rest of the way. Level editor is finally working again on Jan. 12, 2000. *************************** *** IP1 Speedup Upgrade *** *************************** Time to completely display IP1 info panel on 25Mhz 030 A3000: IP1 display currently takes: 51 frames. A bit over 1 second. Implement FakeBlueScreen Trick: 30 frames. Just for fun I commented out SetRast (IP1HiResRastPort, BLACK); 23 frames. Indicating it takes 7 frames to do SetRast while a 64-color lores screen is being displayed. Commented out RectFill(pr,0,0,320,65); 22 frames. Indicating it takes almost 1 frame just to do that in 64 color mode. Ok now I'm timing how long it takes to do the rectfill + setrast while in lores 1 bitplane mode (by pushing fake1bplscreen to front) 27 frames. 25 frames on nothing/nobody. 19 frames by #ifndefing out the current and max numbers. Implement CopyMemQuick Trick: should be 9 or 10 frames. 15 frames. 14 frames on nothing/nobody. Eliminated 2 ScreenDepth() calls 14 frames. 13 frames on nothing/nobody. * Optimize PutScreen() to not move the screen if it is already in the correct position. DONE. This effectively eliminates 2 PutScreen Calls. 12 frames on nothing/nobody. * Change all the colors from HiResYellow to IP1HiResYellow etc. DONE. * Make HalfHiResYellow be color 1. Mask = 1 when writing the antialias color. Make HiResyellow be color 9. Mask = 9 when writing the HiResYellow. Should double the speed of number printing from 6 frames to 3 frames. So I am just switching the positions of IP1HiResYellow<->IP1HiResGreen1 DONE. 10 frames on nothing/nobody. TOTAL SPEED INCREASE: 5.1x ****************************** *** END IP1 Speedup Ugrade *** ****************************** * Make the small IP1SmallLoResScreen be really small in the OpenScreen() command. This will fix that lame glitchiness permanently! DONE. Ok, the glitchiness is fixed but now the mouse pointer teleports in order to stay within the bounds of the small screen. This is very annoying. So my options now are: A: Revert IP1SmallLoResScreen to be a full 512 pixels high and suffer with a glitchy display (the glitch is only displayed for 1 frame) B: Do option A + install a UserCopperList to set all colors to the background color. This would fix the glitch. But I have no idea how to install such a UserCopperList. C: Keep the screen small and just keep track of the mouse position and restore it. This should work but will cause a "mouse-pointer glitch". There is no easy way to do this. I'll hafta hack some code in to make this work. Special thanx to Kalsu for supplying me some example code for this. This is the option I will attempt. D: Leave the small screen small and make the big screen be 512 pixels. Put the big screen at the top of the display and the small one at the bottom. This would solve all the problems. But then we would have the pic of the creature and the powerups and kills at the bottom of the screen. This is the easiest way to fix it. How do you feel about this? E: Try setting BORDERSPRITES to see if that fixes things. I really don't want the mousepointer going into the side borders. I only want it to go into the bottom border area. But there is no way to specify this so I'm not going to try this option. * Implement Option C by making a function MoveMousePointer(x,y) DONE It basically works but the mousepointer flickers and jerks because its being moved around. So I'm now going to try Option * F: Make the IP1LoResScreen be the full 512 pixels high but in order to prevent glitchiness I'll set its color palette so that all 64 colors = the background color until the screens are all properly arranged. Then I'll reload the pallette back to its normal setting. DONE. WORKS GREAT. NO NOTICEABLE SLOWDOWN. NO MORE GLITCHES. *20. Reduce size of IP1HiResScreen and BitMap and Window down from 512 to 443 (the exact right number) to speed things up. DONE. The IP1 and IP2 displays are now exactly 512 pixels in height. This noticeably increases chipram bandwidth since it has eliminated around 16 pixels of vertical overscan. *21. Snapshot the base IP1 displays using straight 32-bit CopyMemQuick and copy them in for vast speed improvement. A. Add in some #ifdef code to cause the numbers and the name and owner to not be printed. DONE. B. Simply save the memory of the IP1HiResScreen straight to a diskfile Screens/IP1HiResScreenMem. 142080 byte file. DONE. If I ever do the 2nd screen it can be IP2HiResScreenMem. C. Modify start.c to load in the new Screens/IP1HiResScreenMem file. DONE. D. Modify info.c to copy the image to the screen instead of using all those timeconsuming AntiAliasWriteText() calls. Copy IP1HiResBaseDisplay to IP1HiResScreenMem. DONE. * Save mouse coords for SP1 screens. DONE * BUG: Promote() messes up the semaphore when performed on an exposed wizard. NOW FIXED. * BUG: Promote() on a scroll can cause enforcer hits. NOW FIXED. * BUG: Graphics of kills on IP2 screen are messed up. NOW FIXED. * BUG: Range is being printed over movement on IP1 screen. NOW FIXED. * BUG: Can't be Smelled/heard/seen is in wrong color and wrong position. FIXED. * BUG: Unexplored Region / Cloaked not erasing IP1 screen. FIXED. FLAW: The filerequester uses routines optimized to smoothly scroll on NONinterleaved screens. SOLUTION: Simply make the HiResScreen NOT be interleaved. When I did this the colors got all messed up on the HiResScreen! I have no idea what is going on. So I'm leaving the screen as Interleaved for the time being. Fix bottom screen glitch. DONE. * Fix screen dragging. Make all screens be nondraggable except for the SP1 screen I suppose. DONE. *1. Simply put the SP1HiResAutoScrollScreen back to x,-512 every time you exit the scroll panel. This will prevent the hiresscreen from moving up and revealing garbage. DONE. *2. Try making the main map screen (screen) be nondraggable also. DONE. *3. Try making the fake1bitplanescreen be nondraggable. DONE. *4. Put the SP2 panel into the correct position with PutScreen(). DONE. **************************************************************************** January 28, 2000 END Information Screens Upgrade **************************************************************************** JJ Bug Report for v2.71: =================================================== * BUG: Promote() doesn't work right. His Undead Green Dragon: turned into a living Emerald Dragon. Ok I completely revamped Promote() to intelligently promote every stat. NOW FIXED. * BUG in Exploration Mode: Jason cast Moveit but when he got his extra move he couldn't see anything! However if he clicked on an "unmapped" square he could still move his units. NOW FIXED. Recompiled v2.71 into v2.72 and reinstalled on his computer. ============================================================================== ====================================================================== Score Screen Upgrade: Make it a borderless backdrop window on a 640x512x16 colors interlaced screen. Just use SP1HiResWindow. Need 11 lines of text * 40 points = 440 points + 1 blank line = 480 points. Just 1 screen for now. Player Scores for Turn x. Player Team Life Score 9 lines of name + score. For now I'll use the same ChaosCalligraphyFont40. But maybe I'll use a different one later when I think of a good one to use. Use Team Numbers instead of graphical symbols. What should the colors be???? I need to use something other than dark blue for the background! For simplicity I'll just use the exact same colors that are already being used. (Black background). Try to use the SP1HiResScreen for the Score Panel and Spell Panel. Oh well I'm tooo tired to care about the colors now. I'm just leaving the colors as they stand. * Score Screen now looks halfway decent at least. ============================================================================= JJ Complaints ============================================================== * COMPLAINT: When playing in (!ExplorationMode and !TexasTrashem) the exploration mode related spells should not appear in your spell lists. Just make a new tag: OnlyUsefulInExplorationMode Spells with this tag will have their probability set to 0 in the chaos.prb file. Their probabilities will be normal in the ExplorationMode.prb file. NOW IMPLEMENTED. Works great. * Spells which are only useful in ExplorationMode are now only dealt out if you play the game in ExplorationMode or in Texas Trash'em mode. * COMPLAINT: He wants a Music OFF feature. NOW IMPLEMENTED. Works great. ================================================================================ * FIXED Magic Sword Description. * FIXED GooeyBlob spell description from "on recovery" to "after being uncovered" CHANGED: * Ropers, Wasp Nests, Pits, Magic Castles and Dark Citadels can now be cast on dead bodies. * Rocks now allow 3 attempts. * Combat Drain Beam damage increased to 8. * Nonarchery is now known as Archerotomy. **************************************************************************** InitialData[] bugs **************************************************************************** Previously there were 3 serious bugs related to InitialData[]: 1. The negative score bug. 2. The isIDcreature() bug. 3. The isIDblahblahetc() bugs (numerous macros were broken). Current bugs related to InitialData[]: chaos.c * BUG: All the recovery code (life recovery, intelligence recovery, etc.) has code that checks the InitialData[id].Life, etc. But there is NO InitialData[id].Life for a magic spell scroll! So the return result is unknown and will be random over time, as spells are changed/added. It could possibly cause an enforcer hit. NOW FIXED by using the macro. * core.c BUG: The code for GooeyBlob uncovering sets: b->char_stat.Life =InitialData[b->id].Life >>1; But there is no such thing for a magic spell scroll! NOW FIXED. * The WakeUp() routine has an InitialData[id].Weight which does not exist for magic spell scrolls. NOW FIXED. * Promote() accesses InitialData[id].Life, etc. This should only be used with creatures so it should not cause any bugs. NOW FIXED. * All occurences of InitialData[] replaced with InitialData() in core.c EXCEPT for InitialData[NOTHING] occurrences. * move.c/Growth() also accesses InitialData[id] but this should only be used with growths so it should not cause any bugs. But a scroll of a growth is still a "growth" so it might someday cause a bug, arggh. * move.c/Growth() more code for uncovering something covered by a growth which accesses InitialData[id] for scrolls that have no such thing. * move.c/Combat() would do an invalid access of InitialData[id] if a magic spell scroll had HORROR on it. * ALL occurrences of InitialData[] replaced with InitialData(), even the ones that were technically 100% safe because in future years after new object types are added they might become unsafe. Better safe than sorry. * spell.c/IntelligentComputerSpellSelect() is using the value of InitialData[id].Life for scrolls which have no such value! Oops the code is actually ok due to it saying "IF (isIDcreature(sp) and InitialData(sp).Life >s[STRONG]" I was thinking it said "isCreature" instead of isIDcreature. I replaced InitialData[] with InitialData() anyway. DONE. * cmove.c/GetCellWeight() is using InitialData[id].FavoriteFood and .RunsAwayFrom! This is wrong for magic spell scrolls. Replaced with InitialData() macro. There is already quite a lot of hacked-in code for not using InitialData[] beyond ExitID and I'm wasting too much time fixing silly bugs that never should have existed in the first place so I'm thinking of implementing the objects more as a true database and adding InitialData[] for EVERY id. This will burn 10 or 20k but since it makes the game more reliable, easier to code and keeps the code cleaner; it should be well worth it. The other option is to hack in some IF-THENs for each of the above listed cases + we would have to remember to do the same each time we add new code which uses InitialData[id]. A third option is to make some sort of GetInitialData() macro which checks that the ID is <= ExitID and returns the appropriate value. Then I just search/replace all occurences of InitialData[] with GetInitialData() USING THIS OPTION. #define InitialData(x) InitialData[(x) > ExitID ? 0: (x)] Not good enough #define InitialData(x) (InitialData[(x) >=0 and (x)<=ExitID ? (x):( (x)<0 or (x)>RevealID ? *(char *)0 : 0)) The above macro will be used because it handles the quirkiness of there not being InitialData for id's over ExitID _AND_ it does array bounds checking! more examples in SC:ArrayBoundsChecking.txt * Replaced all occurences of InitialData[] with InitialData() macro just to be safe in cast.c and info.c and init.c and all the spell files. Could just have a "magic spell" bit to delineate the 2 regions? * Chaos now has Array Bounds Checking, but only on the InitialData array. Currently for the bounds checking to actually report anything you must run the game under cpr and have enforcer running. Then bad subscript errors are trapped and the cursor is placed on the offending line just like in BASIC. **************************************************************************** END InitialData[] bugs **************************************************************************** * BUG: Violet Fungi graph has a line drawn through it. FIXED. * BUG: The right hand side end turn gadget isn't being redrawn when you examine an object on the board or a spell in your spell list. FIXED. Feb. 15th, 2000: * Incorporated SAI's new arcing weapon effect on all the elves. Feb. 16th to Feb 22nd: Moving to new apartment. No programming accomplished. Feb. 23: Internet account stopped working. My paid subscription ran out. ========================================================================== Feb. 23rd to 29th: * 10 NEW CREATURES: Mighty Orc, Oracle, OmniBiologist, Recognomancer, Memory Master, Memory Mage, Necromancer, Chronomancer, Hippocrates, Aesculapius. Mighty Orc who (looks just like an orc / looks like an orc with a big battleax) Mighty Orc has stats identical to Orc but with 15 combat. Prob=9. Orc has PromotionCount=3, promotes to MightyOrcID An Oracle could be equivalent to a Crystal Ball. Just add a .Oracle bit to the wizardinfo struct and check it along with .CrystalBall The Oracle has a Crystal Ball which benefits the casting wizard. Oracle can use a fakewizard graphic #6. OmniBiologist uses a fakewizard graphic #8. 19 life, 1 combat, 1 move, 0 recover. The OmniBiologist is a Biologist, Exobiologist, Chronobiologist, Xenobiologist and Exoplanar-Biologist all rolled into one. He can instantly recognize any lifeform from any time-period, or from any other planet, or even from any other plane of existence. Upon viewing any scroll, he can recite from memory the complete statistics for any creature. If he can make 3 kills he promotes to Recognomancer. Recognomancer fakewizard graphic #7. 19 life, 1 combat, 1 move, 0 recover. Either 2 ranged combat against mr (range=3) or make him have actual lightning bolt spells. Graphic of Wizard with staff. The Recognomancer is similar to the Omnibiologist but he carries a deadly magic staff, making him much more lethal in magic combat. Memory Master Shade Graphic (stats of Ogre) + .memory bit set The Memory Master has perfect Eidetic Memory and will always remember what is under the object in any square on the board. Memory Mage similar to Ogre Mage! Shade graphic. (stats of OgreMage) + .memory bit set. Aesculapius is The Roman god of healing. 0 combat. -4 combat against all non recovery rates. Range=3. Archery. Max recovery rates in everything. Special Combat -4 against life only. Fake wizard #5. Hippocrates: 0 combat -3 ranged combat against life only. Range=1. The legendary Greek healer. Special Combat -2 against life only. Fake wizard #4. Necromancer: #3 (casts Kill and Raise Dead 33% of the time.) Chronomancer: #2 (casts Vanish 20% of the time.) 3 new special creature types: .Memory (remembers what is under a cell. Elephant, Memory Master, Memory Mage) .RecognizeCreatures (allows you to see the stats of scroll creatures + recognizes the creatures in your bonus spells list. OmniBiologist and Recognomancer) .Oracle (equivalent to having a CrystalBall. Oracle) * Need the above 3 in the wizardinfo struct also. DONE. * BUG in sm.c: It won't process my creatures with negative combat or negative ranged combat. NOW FIXED. * Special Programming for Oracle done. * ELEPHANT now has perfect Eidetic Memory. * INFO PANELS modified to show you what is under the cell if you have the memory powerup. We might want to make a graphic that means "You currently possess the perfect Eidetic Memory Powerup" to be displayed as a wizard powerup in ExtraDisplay(); If anyone wants to draw or render or rip such a graphic then please do so. Should there be an "Eidetic Memory" spell? It seems too weak. Its better to cast a creature that has Eidetic Memory built-in. Need to add code so that if you have the .Recognize powerup, pressing the LMB on the 2nd info panel of a scroll brings up an info panel of stats showing the InitialData[id] stats. So how do I do this? I can't simply make a pointer to a fakecell and call the InformationPanel() with this pointer because InformationPanel() has code which requires a numeric cell number. Actually there are only 2 lines of code which require a real cell number and they are related to exploration. (A long time ago I had to take the exploration info out of the cell structure because it saved me a LOT of problems rewriting code... however the price is that it is now causing me THIS problem) Luckily this is easily worked around. Options: A: allocate memory for an extra cell in board[] and use that as a fakecell. Then the cell will have a real number. This would be very easy to do but would wreak havoc with the array bounds checking. DO NOT DO THIS. B: Change the InformationPanel() cell parameter so that -1 means "This cell is a fake cell" and then add in 2 if-thens to not use any code that requires a real cell #. (only the exploration-related code requires a real cell number due to exploration bits not being contained in the playCell structure.) DONE. * Now I can simply make a pointer to a fake cell struct and call InformationPanel() on that fake cell struct! Easy. * If the wizard possesses the .Recognize powerup then pressing the LMB on the 2nd info panel of a scroll brings up an info panel of stats showing the InitialData[id] stats. DONE. * New Routine: RecalculatePowerups(); Casting the memory master gives you the Memory powerup. Death of memory master makes you lose the powerup. Ditto for RecognizeCreatures powerup and Oracle powerup. A death or warp requires a total recalculation. A birth/insert doesn't really need a total recalculation it just needs a simple test on the 1 creature. For simplicity I will do a total recalculation in every instance since deaths/warps/births/inserts don't happen very often so cpu speed is not essential. Also doing the total recalculation each time will help to "cover up" future bugs whereby some new spell does something wacky and forgets to call RecalculatePowerups(); Do creatures which are in the underpart of a cell provide powerups? I am going to say YES because: #1: Its easier to code it that way. #2: It sort of makes sense that an Oracle underneath a growth would still be able to see things with his crystal ball. (ok not really... but..) It sort of makes sense that a Recognomancer under a growth would still be able to recognize things by the wizard sending him a mental image of the thing to be recognized. It sort of makes sense that a Memory Master would still remember everything while he is under a growth. #3: Nothing needs to be recalculated just because something went from the underpart to the visible part of a cell (or vice versa). * Added in code to call RecalculatePowerups() in all appropriate core.c functions EXCEPT BackUpCellWizard() and RestoreCellWizard() because I'm not sure how those do/should work. Unfortunately RecalculatePowerups may get called 2 or 3 times in certain routines like Reinstate. * Added in code to call RecalculatePowerups() in warp.c. That SHOULD cover all the places that need RecalculatePowerups() added. However if there is any place in the code that removes some thing from the board or puts something on the board without using 1 of the above routines then there will be a slight bug. Should such a thing happen it will be neccessary to modify the offending code with a call to RecalculatePowerups() or modify it to use one of the above routines. * BUG: EditorPaste just puts stuff into a cell without using InsertCreature() and it doesn't ever call RecalculatePowerups(); so inserting Oracles, Memory Masters, Omnibiologists etc. doesn't give your wizard the appropriate powerup. NOW FIXED. * BUG: RecalculatePowerupsFlag was a BYTE instead of a LONG so it was completely and utterly broken. NOW FIXED. * 3 NEW STATS: .RecognizeGrowths (MullacDeIrvine) .RecognizeInanimates (Inanimatologist, Inanimage) .RecognizeSpells (Recognomancer) Recognomancer has all above stats set to true. * 3 NEW CREATURES: Mullac De Irvine: like a undead fake wizard but can recognize growths. (Wizard graphic #1) 4 kills promotes to Recognomancer. Inanimatologist: Can recognize Inanimates (walls, trees, etc.) Needs a graphic. 3 kills promotes to Inanimage. Inanimage is like an Inanimatolgist with the stats of an Ogre Mage. He heals the friendly inanimates around him. (Same graphic as Inanimatologist) * HORRIBLE BUG in sm.c: I have a line in the Recognomancer.spl file: Stat: STANDARD_CREATURE | STATIC_STAT | RECOGNIZECREATURES_STAT | RECOGNIZEGROWTHS_STAT | RECOGNIZEINANIMATES_STAT | RECOGNIZESPELLS_STAT It absolutely refuses to process this line. It gives bogus errors and screws up the compilation. It says "Unexpected white space in tag Stat" "Ignoring rest of line in attempt to recover." Ok, the problem was that the LINE_LENGTH in sm.c was set to 128 and after the 128th char it tried to process the rest of the line as a "Stat:" tag (?) Anyway I changed LINE_LENGTH to 256 so its ALL FIXED NOW. * Bonus Spell Selection now prints the name of the spell you are pointing at (if you have the appropriate .recognize powerup) at the bottom of the screen. Should I allow "q" to work on the bonus spell screen? Or should it just tell you the name of the thing you are pointing at? * 2 new bits: .RecognizeProgramming and .Ibrowse (mind reading). * 2 NEW INANIMATE OBJECTS: Burstroem's Browser: Allows you to browse through other people's spell lists. Optometron of Omniscience: sets all .recognize bits + .RecognizeProgramming + .Memory + .Ibrowse I couldn't decide how to implement the encryption of the programming files so I haven't implemented the .RecognizeProgramming feature yet. I guess vampire.c just needs to be rewritten as FastVampire.c to load an entire file in and encrypt it and write it back out. The current version of vampire.c is entirely toooo slow and greatly reduces compilation speed. Just copy coding techniques from jcformat.c into vampire.c. Copy everything into sc:chaos_2.81 before I attempt this stuff! I might screw everything up! Special programming for the .Ibrowse bit: Just make a simple modification to 1: RedrawRightHandSide(): NONE NEEDED 2: Simple modification to the BoardUpdate(); DONE 3: Simple modification to GetSpells(); Just had to move the .necro and and .forgot random clearing code to BoardUpdate(); DONE. 4: DisplaySpellList(); NONE NEEDED 5: Some complicated mods to HandleIDCMP(); DONE. _________________________________________________________________________ When I compile I am getting an error in line 2681 of chaos.c "Error 218: declaration found in statement block" This is useless. And I have no idea where the problem is or how to fix it. When I JCformat chaos.c it tells me: "Error in line 2416: Ending does not match beginning." This is yet another example of a C compiler giving a useless error on a line when the REAL error is hundreds of lines of code away. * Problem fixed in 2 minutes thanks to JCformat. __________________________________________________________________________ March 5th, 2000. * If you have Burstroem's Browser or the Optometron of Omniscience you can now press ctrl-# to browse through other player's spell-lists! Its very cool! Pressing the "end turn" / "return" gadget exits the browsing/peeking/mind reading back to your normal spell-selection. DONE. ========================================================================== * BUG: An Independent Aesculapius keeps shooting my creatures and healing them. NOW FIXED. * BUG: All enemy creatures with negative combat (Hippocrates and Aesculapius) keep healing their enemies and NOT healing their friends. NOW FIXED. * BUG: A human player cannot attack his own stuff with his healing creatures. NOW FIXED. * NEW FEATURE: You can now attack your own creatures if such an attack would heal the creature. * BUG: Healing attacks make no sound and no graphical effect. NOW FIXED. * New bit: EXOPHAGY_STAT * New stat BYTE char_stat.Scavenge (allow for negative numbers) * 4 NEW SPELLS: Eidetic Xenogenocide, Mnemicide, Scavengerism, Exophagy. * IMPROVED AI: I made a new FLAG_HIGHCOMBAT bit to help out the AI of the DemonicTouch and Exophagy spells. * Eidetic Xenogenocide has its own special AI routine to decide when to cast it. * Scavengerism provides +8 Scavenging to any scavenger or +4 scavenging to any nonscavenger. A scavenger eats corpses. Bon Apetit! Scavenger/Nonscavenger is determined by the InitialData[id]. (isIDscavenger(id)). Should be as common as Recover Boost. * Exophagy is the act of eating your enemies alive. Yummy. Half of the damage you inflict in hand-to-hand combat will be added to your life force. Should be as common as Recover Boost. * BUGS: Sleeping Ropers teleport, Sleeping Haunts change sides, Sleeping Volcanos explode, Sleeping Spriggans fall asleep and Sleeping Meditations Collapse. NOW FIXED. * IMPLEMENTED special code into BoardUpdate() for handling scavenging on March 8th, 2000. HandleScavengerism drains your ScavengerValue*2 from the dead creature beneath you and gives you ScavengerValue of points to your life. You can't drain more life than the corpse has. When you drain a corpse down to negative of its normal maximum it is devoured and disappears. You can't gain more life than your normal maximum. Scavenging always happens AFTER regular healing with recovery rates. I have not tested negative scavenger values. They might freak out. Who knows? * NEW SCAVENGER ABILITY: Vulture +2, Giant Rat +4, Neo Otyugh +4, Tyrannasaurus Rex +5, Dire Wolf +2, Arctic Wolf +2, Orc +1, Mighty Orc +2. I might try to make Exorcist -1 later. * ADDED Scavenger to the 1st info screen. It is only shown for those creatures that actually have a Scavenger value. * BUG: Speech for Neo-Otyugh and Inanimatologist doesn't work! NOW FIXED. * ADDED Exophagy to the 2nd info screen + the level editor. * ADDED Exophagy to the combat system. * Currently exophagy only applies to LifeCombat. So damaging an opponent's intelligence doesn't gain you any intelligence. Perhaps this should be changed? This exophagy concept needs to be playtested. Enhanced scavenging mode: 1: If there is no scavenging going on this turn then don't play the music. 2: Play the scavenging music. modified ChaosTheme42 3: Count up how many creatures will scavenge this turn. Divide this number into 7 seconds (350 frames). This is how much time each creature will be highlighted. Highlight time not to go lower than 50 frames. So 7 seconds is long enough for 7 scavengers. The mod can just be position 16 and 17 "eatem up yum yum" then 6,7,8 then looping. 35 seconds of music is way longer than I'll ever need. That's enough for 35 scavengers. It will take at least 21 scavengers to get to the cool part of the mod. I'll try to work out some way so that the Scavenging Phase can flow into the Artifact changing phase So 7 scavengers or less plays Mod A. (1 pattern of eatem up yum yum then the wild pattern happens at the same time as the screen for "Artifacts Changing Wwners Phase". So 8-14 scavengers plays Mod B. (2 patterns of eatemup yum yum then the wild pattern happens at the same time as the screen for "Artifacts Changing Owners Phase. Possibly should put in some sort of "Dammit he stole my artifact!" or "He stole my artifact!" into the mod. Mod AA is for the short 1st part + the wild part with "He stole my artifact!" Mod BB is for the double 1st part + the wild part with he stole my artifact!" 4: Highlight the creature and do a WriteNearBottom: James's Neo-Otyugh eats some Red Dragon Meat. Life +4. Wait 50 frames. NEXT. {flesh,meat,carcass,corpse,cadaver} {eats,chows down on, munches on, nibbles on, drinks, sucks on, slurps down, scarfs down, chews on, feasts on, ingests} "%s's %s {eats} some %s {flesh}. Life %+d" HORRIBLE BUG: When I added 2 new lists into TalkLists I started having enforcer hits and crashes. I ran mungwall/sushi and got tons of mungwall hits. I think I fixed one longstanding mungwall problem but I haven't yet been able to stop the current problems and crashes. When I use the old talklists file, everything works fine as before. This is all very strange. Several days later: I narrowed the problem down to 1 of the 2 following lines of code by simply inserting TerminateChaos(0) at various points in the start.c startup code. One of these 2 lines is totally trashing memory and corrupting things: start.c/CommenceChaos() IF (!(ListNameArray=(char **)malloc((NumberOfLists+1)*8))) THEN TerminateChaos(CHMEMORY_ERR); END_IF start.c/TerminateChaos() IF (ListNameArray) free(ListNameArray); So either malloc() or free() has horrible bugs (which seems highly unlikely) or there is some other bug somewhere that is trashing some of the memory holding the code for the malloc() and/or free() functions (this seems AMAZINGLY unlikely, since trashing some program code would normally produce an ILLEGAL INSTRUCTION guru.) I have replaced that particular malloc/free with AmigaOS AllocMem/FreeMem and now the program SEEMS to be working perfectly with no enforcer hits and no mungwall hits. HOWEVER, it is my opinion that there is still a bug somewhere that is trashing memory because I just ran and quit chaos twice and then typed "smake" in the shell and sc gurued with exception 80000004. During the last few days of trying to kill this horrible bug I found some other hideous bugs that I fixed. * BUG: You cannot use the same struct NewScreen to open 2 different screens. If you do there will be lots of hideous mungwall hits deep in the OS where X bytes of memory are allocated but only X-y bytes are freed. NOW FIXED. I think the same thing might be true for struct NewWindow so I modified the intro code to use 2 seperate NewWindow structs. * MEMORY LEAK: Each time that CloseWindowSafely() is called results in a 34-byte memory loss. I have no idea why this is happening since CloseWindowSafely() doesn't allocate any memory! I didn't write CloseWindowSafely(), I simply copied it from the Amiga Developer's CD Oh well... I have replaced all calls to CloseWindowSafely() with old fashioned CloseWindow() and now there are NO memory leaks in Chaos! YAY!!! * BUGS: I still get a mungwall hit + bizarre crashes with zillions of other mungwall hits (sometimes from input.device or Iprefs or CygnusEd, etc.) each time I run chaos, set the options then immediately quit on turn 1 without doing anything. So I have now replaced 2 of those other mallocs and now everything seems to be working perfectly. THIS IS VERY STRANGE because I replaced the malloc()s with AllocMem() but FORGOT to replace the free()s with FreeMem()! 1. reset puter 2. run muforce stdio 3. run muguardianangel nametag nostackwarn 4. run sushi asksave 5. run cpr chaos OR 1. reset puter 2. run c:enforcer/enforcer stdio 3. run mungwall task chaos nametag 4. run sushi asksave 5. run cpr chaos MuLink.lha dev/misc 94K 4+Memory protect selected hunks of binaries Mem2_2.lha util/moni 39K 77+Memory viewer, editor and browser memtest.lha util/misc 12K 357+Memory Tester * BUG FINALLY SOLVED: Ok, the REAL problem was in the TalkList file handling. There were various FOR-NEXT loops that went while p<=TalkListBufferEnd when they REALLY should have said p>creature.d delete ram:images.tmp delete ram:il.tmp sc $(STDOPS) nodebug optimize memorysize=huge creature makedata is used to creature creature.d and then the type command is used to join "il.tmp" onto the end of creature.d. So I guess il.tmp is not being created properly. But makedata.c is simply processing whatever is in makedata.txt!!!! I cannot figure this out! Ok I sort of figured out what was actually missing from the program and hand edited everything to work. This took a couple of hours and made me late for work. I imagine this is all going to happen again the next time I add new spells to the game and must completely recompile everything. I fixed this months later once I discovered that a *.tmp file was missing in the directory. ------------------------------------------------------------------------ * BUG: When playing Texas Trash'em Select a spell, then examine a spell. When you are finished examining your spell only the part of your spell list up to the point of the spell that you are casting gets redrawn. The others are not redrawn. This is a problem in DisplaySpellList(). NOW FIXED. ========================================================================= * Modify the combat routine to play the combat sound if present for this monster. DONE. What the hell do I do now? Do I make a NEW ROUTINE called: CellEffectWithDigitalSound() Disadvantages: It would HAVE to duplicate all the gfx code of CellEffect() therefore it seems stupid. Advantages: Don't hafta go through and add ,NULL to all function calls. Or do I just add a new parameter to CellEffect() Disadvantages: Hafta add ,NULL to all existing CellEffect() calls. Advantages: Allows me to mix and match any gfx effect with any sound effect. I am going to send in a char * parameter which points to a string which contains the filename. Here is the BIG problem! I don't want to have to constantly do sprintf(text_store,"Combat/%s",creature_name[x]); I could JUST pass in ,creature_name[x]) THEN IF it is a ATTACK sound then CellEffect will assume the Sounds/Combat/ part of the filename and do the sprintf itself. * Changed Jillions of CellEffect() calls to also pass a ,NULL parameter. Hopefully within a year most of these NULLs will be replaced with real digital sound effects. ========================================================================= 0. Assign a couple of sound effects to test out the system! Ok it works BUT OMSS 1.03c and DSS8 and SFX3.50 all refuse to save the playback speed information into the sound sample! So the speeds are all wrong! OPTIONS: A: DL that little ratechanger cli proggy from aminet. samrate15.lha mus/edit 12K 128+Changes pitch of 8SVX samples No, this is a pitchshifter which is very nice but not what I want. B: Switch to a new sample editor program from aminet or from my collection. There are about 2 dozen different ones! I have no idea which ones to try! I guess I'll try the 10 year old AudioMaster 4. I FINALLY FIGURED IT OUT. In OMSS you must hold the mouse button down and simultaneously press a note key to register your note. THEN from within the Sample Editor Window you must select Tools/Copy Pitch/Sample Editor -> Inst. Default * BUG: If you have a creature that has Ranged Combat and he is attacked by a Range Drain Beam spell such that his Ranged Combat is reduced to 0 then a subsequent Range Boost spell will NOT work on him! Simply put: the bug is that Range Boost does not work on creatures with 0 Ranged Combat EVEN THOUGH they had some "initial ability". NOW FIXED. * INSTALLED over 50 new digital sound effects into the game. * The Eagle has a real Eagle sound when attacking. * The Vulture has a real Vulture sound when attacking. * The Crocodile and ShapeChanger have a real Alligator sound when attacking. * Magic Glass now makes a breaking glass sound when it is killed. * Dire Wolf yelps when it dies. * Arctic Wolf whimpers when it dies. * All Dragons make hideous screams when they die. They are now 4x as much fun to kill! * When you kill a generator the crowd goes "Aaaaaaaahhhh" in amazement. * Jaguar and Leopard go "rrreeeeeooooowwwwwrrrr" when they die. * Stone Giant says "I kill you!" when he kills someone. * All Ogres say "Attack!" when they attack something. * All dragons, cats, Hydras, Bears and Tyrannasaurus roar when they attack. * Neo-Otyugh makes an eating sound when he attacks. * All Wolves howl when they attack. * Robot makes a mechanical sound when it attacks. * All Horse-like creatures make real Horse-like sounds when they attack. * Gorilla makes a real Gorilla sound when attacking. * Fire Demons and Devils laugh evilly when attacking. * Ghost goes "wooOOooOOooOOoo" when attacking. * Camel makes a real Camel sound when attacking. * Water Elemental makes a water sound when attacking. * Fire Elemental makes a burning fire sound when attacking. * Air Elemental makes a wind-blowing sound when attacking. * Earth Elemental makes a rocks falling sound when attacking. * King Cobra makes a rattlesnake rattling sound when attacking. * Stone Giant goes "OOOORAAH!" when attacking. * Wolverine growls when attacking * Bodak and Bird-Lord make sounds when attacking. I need to have some sort of generic attacking and dying sound for all those wimpy bipedal creatures. Any ideas? * INSTALLED 3 new chaos theme songs on March 29th, 2000. * CHANGED scavenging to drain as many points as are gained. (It used to be 2x as many.) ====================== JJ Bug Report: ============================== * BUG: Turmoil caused wizards to be riding independent generators, fauns, etc. This was caused because TurmoilHandler() ONLY checked if the source cell had a mounted wizard and moved the wizard correctly. It wasn't checking if the destination cell had a wizard. NOW FIXED. * STUPID: Wizard cast Restoration on his cloaked, combat, magic shielded wizard. I changed it so wizards no longer cast restoration on their cloaked creatures. NOW FIXED. * BUG: Wizard is engaged to a creature. Wizard attacks magic wood tree and kills it thus immediately moving into the space and disappearing into lala land. Ok, I have now made it so that if a wizard is engaged he cannot attack, mount or move onto any meditation. It will simply say "You cannot enter a meditation while engaged". NOW FIXED. * BUG: Necropotence usually causes the game to lock up. I played a game and cast Necropotence on a computer wizard and he cast Necropotence on me several times but nothing bad ever happened. Ok I'm trying it again this time I've set it up so that the computer guy doesn't have ANY creatures, thus if I Necropotence him he'll have NO spell to cast. It locked up in an infinite loop. NOW FIXED. ===================================================================== * REDUCED THE VOLUME of the algorythmic sound effects so they don't overpower the digital ones. Technically they have always been too loud. A perfect sine wave going from +127 to -128 is really too much. I've reduced it to +90 to -90. * CHANGED Vampire to have -4 recovery + exophagy so that when he attacks he recovers 1 point. If he does not constantly feed on creatures he will soon die. * SWAPPED the ranged combat stats of Shadow Dragon <-> Pseudodragon so they would make more sense. * PROBLEM: You can get an Iridium horse in every single game because a typical game includes 2 or more aviaries, thus Bird Lords are abundant and its only a matter of time till you get an Iridium Horse. This whole thing is actually a bug. Iridium Horses are SUPPOSED to only be made when killing a DRAGON (or a Tyrannasaurus Rex). NOW FIXED. * Now using the "Hallelujah" choir sample for the bonus spell noise. * ADDED IN THE CODE TO PROCESS Sounds/Kill/ and Sounds/Death DONE. Now anyone can make a sound effect for when a creature kills something or for when a creature dies just by putting the sound in the appropriate directory and naming the file with the name of the creature. * I went back and listened to every sound effect and several of them were not very loud so I edited them and increased their volume to 188%. I kept the original sounds in sc:OriginalUnmodifiedSounds/. * BUG: Sometimes the digital sounds fail to play because they can't get one of the audio channels. I believe this is because AlgoFreeChannel was not doing a ADCMD_FREE before it closed the audio device. Also sometimes the speech flips out and sounds on 2 channels at once. ALLEGEDLY NOW FIXED. (hopefully this fixes the subsong problems too) uhh... hmm... The only thing that has changed is that the algorythmic sound effects now proceed MUCH faster than before.... They appear to be at least 4x faster. Probably because it is freeing the channel before the sound is complete. I still get all the same weird audio bugs as before. :( 1. Play a test game with the speech OFF to see if that makes any difference. It didn't make any difference that I could tell. Sometimes JCSound couldn't allocate its channel just like always. :( 2. Play a test game with speech OFF and sound OFF. Still got the same weird random bugs, possibly due to the fact that sound OFF only turns off certain sounds while others still make noise. 2. Investigate FreeAlgoChannel() 3. Investigate reusing same struct IOaudio thing. So either Speech routine is messed up or Algo sounds routine is messed up or both! Originally the audio device was only opened once and then it stayed open for the whole game. Now it is opened and closed all the time. So nowadays the first time we open it, we are using a zeroed out ioaudio struct, and everytime thereafter we are using an ioaudio struct with stuff in it. AS AN EASY TEST, JUST MEMSET THE STRUCT TO 0 AND PLAY A TEST GAME THAT WAY TO SEE IF THE BUG GOES AWAY! The bug is still there! Ack! Simply add in a ADCMD_FINISH; Wait(); before the CloseDevice. I did this and played a short test game. It only messed up once and that is when I noticed the speech playing on 2 channels at once. However I don't know if it messed up before or after the speech. I think it messed up after the speech did. Did the speech mess up on its own? Or did it mess up because the algosound messed up? I played YET ANOTHER test game to see if it messes up with SPEECH OFF. Ok the sounds NEVER messed up! YAY! So the only remaining sound effect bug is in the speech system! I looked over the code and didn't see anything obvious. I'm leaving this bug for SAI to fix. If he can't fix it then I'll just rip out the narrator.device speech and replace everything with digital speech. * HACK FIX: In order to work around the sound channel problems caused by our use of narrator.device, I have put some code into JCsound so that the -2 option (play a mono sample on both left & right channels) will switch down to playing it on _any_ channel it can get hold of if one of the channels is unavailable. I played part of a test game and the sounds seem to be working 100% now with this fix installed. But I'm sick now and I only played several turns. ALLEGEDLY FIXED. * BUG: Hippocrates randomly gained a combat point and it made him have 0 combat!!! Fix this by checking for negative combat and if so then -1 the combat. Make sure it doesn't go below -max_combat. NOW FIXED. * MODIFIED RANGE BOOST: so that if it is applied to a creature with negative ranged combat, it will subtract 4 from his ranged combat; thus it will heal 4 points more. It still adds 4 to the range as usual. * BUG Grizzly Bear Combat sound is not working!!! NOW FIXED. * BUG Kill files are not working!!! (Stone Giant didn't say "I kill you") NOW FIXED. Always REMEMBER to enclose filename in \" marks! So spaces in the name won't mess it up! Maybe I should make this into a function? * Read docs for narrator.device to see if it is ok to send in an uninitialized struct when opening the device? Yes it is 100% ok to do this. According to the RKRM: Opening the device sets the struct to all default values. * April 15th: Installed OS 3.1 ROM into JJ's A3000 computer. He now has a full fledged OS 3.1 computer. I would have installed a web browser on it so he could read the .html spell docs but he only has 4 megs of fastram. * BUG: A computer wizard cast Vodka on the independents. Their combat was halved like it was supposed to be... but it never said "Independents are drunk with vodka" and the screen did not wave during their movement. NOW FIXED. ========================================================================= April 15th JJ bug report: * BUG: Generators do not heal 7 intlligence like the stats say. (Note from JC: Actually NONE of the generator's stats heal like they are supposed to except for life.) NOW FIXED. * BUG: Casting Inanimorphobiosis or StoneToFlesh on a ShadowWood doesn't let you move it around and attack with it. NOW FIXED. * BUG: He walked up next to a computer wizard and did not get engaged to him! But that's ok because the wizard was inanimate and you are not supposed to get engaged to inanimate objects. BUT this inanimate wizard was roaming around killing things! So the real bug is: * BUG: Inanimate Wizards can still move and attack. I have 2 options for this: A: Make it illegal to cast FleshToStone and MassPetrification on wizards. B: Allow it to be legal and just fix it so that Inanimate wizards can no longer move or attack. They will still be able to cast spells as usual. And they can reanimate themselves by casting StoneToFlesh or Inanimorphobiosis or Restoration on themselves. I am choosing option B: for now. If for some reason this does not play well then I can change to option A: NOW FIXED. * BUG: An Aerial Servant with max combat gets covered by a growth. You kill the growth and it still has its max combat. Only the life is cut in half. That is ok. But if a creature is under a growth for a long time, it eventually gets all of its stats set back to their original values but with life cut in half. This effect can cause massively awesome creatures to be reset to their original lameness. This effect can also be used to heal poisoned creatures. -------------------------------------------------------------------------- Note from JC: the actual "bug" is that if a creature is covered by a growth and the growth dies of natural causes then the creature's stats are reset to their original values. However, this is not a bug but merely an "Undiscovered Rule" :) It can be interesting to intentionally allow your poisoned or wounded creatures to be covered so that they can be healed. If you want the creature to be returned to its original stats then you must let it stay covered till the growth dies of natural causes. If you do NOT want the creature to be returned to its original stats then you must kill the piece of growth ASAP. In either case, the life of the creature will be set to one half of its normal maximum. -------------------------------------------------------------------------- End of April 15th, JJ Bug Report. =========================================================================== * PLAYED a test game where my wizard and the computer wizard were both inanimate. It was very interesting and played quite well! * BUG: Artifact Creature is covered by growth, growth dies of natural causes, Artifact creature is no longer an artifact but a REAL creature. NOW FIXED. * BUG: Red Dragon Scroll is covered by a growth, growth dies of natural causes, Now the scroll is a REAL Red Dragon belonging to NOBODY! NOW FIXED. * BUG: My wizard is inanimate. But I can still click on him. When I move him he doesn't move but some sort of bizarre copy of him is made whose animation is composed of a wizard image, a dead image of something and a grey elf image. All its stats are 0, but its initial stats are all set to those of a wizard, so its stats look like those of a dead wizard. Even though it says its "Nothing. (Nobody)" NOW FIXED. * BUG: My Inanimage is ONLY healing my adjacent wizard! It is somehow not healing my Brown Bear and my Wood Elf. DOH! This is not a bug! The description of the Inanimatologist clearly states that it only heals adjacent inanimate objects. And since my wizard is inanimate in this game he get's healed but my other creatures are not. EVERYTHING IS OK. * OH GOOD GRIEF! OK Chaos is running and I'm online. I play chaos for a while. I'm now in the spell-selection phase. I notice the modem lights look strange and I go to check my email. Yam reports that I don't have a TCP/IP stack running (The modem has just gone offline due to it being such a long time since I did anything online). SOMEHOW this error window freaked out the music in Chaos!!!! THIS SHOULD BE IMPOSSIBLE!!! The music has allocated the sound channels at MAX_PRI!!!! Arrrgh! Well at least I figured out the bug: The music system defaults to using CIA timer chip #1. If it isn't available it uses CIA timer chip #2. But Miami can ONLY use CIA timer chip #1! If it isn't available it just tries to steal the use of it, thus screwing up anything that is using it! So really this is a bug in Miami. * Solution: Go online BEFORE starting Chaos. If you go offline for some reason and you want to get back on just turn the music in Chaos off, then get online, then you can turn it back on if you like. If you forget about this and can't get online for some reason. Just turn the music off and then you might be able to get online easily or Miami may have already internally crashed. AFAIK this problem only affects Miami, not other TCP/IP stacks. * NOTE: Above 2 bugs things seem to have disappeared in late 2000. I think maybe it was just caused by some weird memory corruption bug that got fixed sometime after May of 2000. * BUG: sm.c will not allow creatures with negative recovery. Thus my newfangled Vampire won't work. NOW FIXED. ************************************************************************ COMPILE TIME REDUCTION: April 24, 2000 ************************************************************************ On a reasonably badly-fragemented (not terrible or anything) 25Mhz 030 I did a complete recompile: smake clean smake BEGIN: 3:17:42 END: 3:39:17 21 minutes and 35 seconds. The last 50 seconds were just doing pool2tex spells.tex On a fresh reboot with no memory fragmentation on 25Mhz 030: smake clean smake BEGIN: 4:17:47 END: 4:38:33 20 minutes 46 seconds. The last 45 seconds were just doing pool2tex spells.tex I have now made a gst (Include:all.gst) by reading the docs in sc:source/all.gst. I have now modified the makefile to use the GST. Now I will time a complete recompile using the GST. BEGIN: 5:09:46 END: 5:22:27 with a Slink error 510: _GfxBase symbol - Near Reference to data item not in near data section. First reference in cast.c to start.c 12 minutes 41 seconds + another 50 seconds for pool2tex = 13 minutes 31 seconds. While on YAM+IRC with 3 open windows it took this long: 6:18:03 6:36:03 18 minutes! Redo timing test with fresh computer and not on internet! No errors BEGIN: 12:22:47 END: 12:36:18 13 minutes and 31 seconds. If we subtract out the time that the spellmanager consumes in its processing of files and the time that pool2tex burns (total of 2 minutes) + the 22 seconds spent printing warnings to the screen then using a GST has doubled the compilation speed. I could rewrite pool2tex and the spellmanager and save around 1.5 minutes thus bringing the compile time down to only 12 minutes but I don't have time for that right now. If I then switched to using a 25Mhz 040 then the complete recompile time should drop to about 4 minutes. Or if I bought a 66Mhz 060 then I could get it down to 1.8 minutes. ************************************************************************ END COMPILE TIME REDUCTION: April 24, 2000 ************************************************************************ * SOUND BUG PERSISTS! I just played a test game and sometimes the end of turn sound randomly does not play when I press the end turn gadget! ARRRRGGHH!!! HORRIBLE BUG: Twice today when I was shooting something the game totally freaked out and locked up. Well once it crashed the whole machine and the other time it locked up. AFAIK this is related to the speech/sound channel bug. The only way I know of to fix this is to remove the computerized speech from the game permanently. BUG: My ally cast Bless and the ChaosWavyTask triggered off 5 MuGuardianAngel hits: All are word reads: 42ed8, 42ecc, 42ed0, 42ed4, 42ed8. MuGuardianAngelBug: Whenever there is a hit, MuGuardianAngel makes some kind of beep that completely corrupts the sound system. It causes the current sound effect or the very next one to run in an infinite loop. Sending a ctrl-c to the JCsound task stops the infinite loop but the game is still locked up. Pressing ctrl-c in cpr is useless. Maybe this is actually caused by the "heavy cpu load bug" that I found later on. A hit stops all tasks for around 1 second. FACT: JCsound cli program works perfectly when I run it from the shell. FACT: using JCsound from within Chaos via Execute("run ram:chaosdir/JCsound filename -2 >nil:",0,0); causes random enforcer hits and crashes. FACT: Many years ago I made a Star Trek game. It worked perfectly. Then one day I put digital sound effects in the game using this exact same technique. Only it was just some sound sample player program that I had, I don't know where it came from. So it was coded by a totally different person using totally different techniques. I called the cli sound player program using the exact same Execute(); technique and from that moment on the game started randomly crashing and locking up. I never figured out what was going on with that. Now I think there is just plain a bug in using Execute() with programs that use audio.device. I JUST TESTED THIS CODE from within Chaos FOR (t=0; t<40; t++) DO Execute("run ram:ChaosDir/JCsound \"Sounds/Combat/Ghost\" -2 >nil:",0,0); Delay(300); NEXT // t++ It worked perfectly. No mungwall hits, no enforcer hits. Now I'm back to thinking it is somehow a bug caused by some conflict between the algorythmic sounds and the digital sounds. I tried it with a Delay(100) and it still worked perfectly. * I just set the priority of the narrator speaking to 127 (MAXIMUM) so that nothing can steal its channel in the middle of it saying something. Perhaps this will fix the speech bug? Ok I just #ifdef'ed all the audio code out of the game. I turned off the speech with the menu and played a test game. It worked for quite a while but then the SAME old audio bug came back to haunt me! The 4th thing I killed with my Ghost caused the JCsound to freak out and cause enforcer hits then the whole computer crashed and reset! Why is that JCsound works perfectly under test conditions but crashes randomly in the real game? I think this must be related to cpu load now. I'll do more tests with the CPU loaded up with stuff to do. Ok I ran the above code loop test at Delay(100) with a gameboard that had around 25 animated creatures on it. Everything worked perfectly. So then I switched to ExplorationMode because that burns a lot more cpu cycles and ran the test again. It was working and had played a few samples then I clicked on my YAM icon (I had yam already running but it was iconified). This used 100% cpu power for about 2 seconds while it sorted through the 604 incoming messages in my mailbox. This caused 1 instance of JCsound to "hang". So that now the loop is playing a sound sample then failing, then playing then failing in an alternating pattern. I believe this is caused by doing a Wait on a certain bit and then only getting 1 message when in fact 2 or more messages may have already arrived. * HACK FIX: I have set the priority of JCsound to run at 126. Actually JCsound was ALWAYS supposed to have been running at priority of 126 or 127 since it barely uses any cpu time and it must run at a high priority to ensure that there is no buffer underflow. Now that I have set the high priority the above test works perfectly! However there is still something fundamentally wrong with the architecture of the JCsound cli command. And someday if some other running task does a Forbid() for 1 or 2 seconds the bug will come back. But at least the game should now run perfectly under "normal" conditions. I played a test game with no algorythmic sounds and no speech and the VERY FIRST digital sound effect (Combat/Ghost) crashed the machine! I repeated the test under extra heavy cpu load. I was decompressing all the jpegs in a directory. No bugs, no flaws. So why does it work perfectly when I do it in the test loop but it crashes so often when I play it as an attack sound during combat???????? Countless other tests producing various results ad nauseum... * DOUBLE BUFFERING BUG FIGURED OUT!! First of all the entire bug is a simple buffer underflow error. However I wasn't correctly handling the incoming messages so JCsound could hang and never exit. I still haven't figured out why it would crash. * THE REASON why it was crashing after I had set its priority to 126 is this: 1. I ran the JCsound program from the shell to test it. JCsound set itself to pri 126, did its thing and exited. I had no idea that the CLI inherits the priority of every program that you run in it! JCsound never set its priority back down to 0 so the default priority of that CLI became 126! 2. It worked great in the shell so I then ran Chaos from the CLI. This means Chaos was running at priority 126! So this completely nullified the effect of running JCsound at pri 126! JCsound was still having to battle Chaos for cpu time! Since the default buffers of JCsound are only 30k (a bit more than 1 second) the buffers were underflowing and messing up. So anyway running Chaos from that CLI caused the JCsound program to crash. * JCSOUND ALL FIXED NOW! DO A TEST: FOR (t=0; t<40; t++) DO SayCreatureName (0); Execute("run ram:ChaosDir/JCsound \"Sounds/Combat/Ghost\" -2 >nil:",0,0); Delay(11); WaitJCsound(); NEXT // t++ IT WORKS PERFECTLY!!! FOR (t=0; t<20; t++) DO StartMod("Music/Mod.ChaosTheme42",5); // song 5 is ONLY the artifact changing music. Delay(350); endmod(); Delay(5); Execute("run ram:ChaosDir/JCsound \"Sounds/Combat/Ghost\" -2 >nil:",0,0); Delay(11); WaitJCsound(); NEXT // t++ First 1 worked, second one failed! Finally a reproducable error!!! Countless more tests and crashes later... I can play a mod and then a sound sample. But I can't play a subsong in a mod then a sound sample. It crashes the machine. Something about playing subsongs is corrupting the audio.device. Ok I modified the start routine so now at least it always starts playing correctly. However, upon stopping the subsong, the next use of audio.device still crashes. I tested this with a stopmod() before the endmod(); It still crashes :( StartMod("Music/Mod.ChaosTheme42",5); // song 5 is ONLY the artifact changing music. Delay(350); stopmod(); endmod(); Execute("run ram:ChaosDir/JCsound \"Sounds/Combat/Ghost\" -2 >nil:",0,0); Delay(11); WaitJCsound(); // This one crashes too! :( StartMod("Music/Mod.ChaosTheme42",5); // song 5 is ONLY the artifact changing music. Delay(350); StartMod("Music/Mod.ChaosTheme42",0); // song 5 is ONLY the artifact changing music. endmod(); Execute("run ram:ChaosDir/JCsound \"Sounds/Combat/Ghost\" -2 >nil:",0,0); Delay(11); WaitJCsound(); // This works!!!! (although there is a slight audio glitch at the end // because it plays song 0 for 1/50th of a second before stopping the mod..) StartMod("Music/Mod.ChaosTheme42",5); // song 5 is ONLY the artifact changing music. Delay(350); StartMod("Music/Mod.ChaosTheme42",0); Delay(1); endmod(); Execute("run ram:ChaosDir/JCsound \"Sounds/Combat/Ghost\" -2 >nil:",0,0); Delay(11); WaitJCsound(); // This crashes as usual. StartMod("Music/Mod.ChaosTheme42",5); // song 5 is ONLY the artifact changing music. Delay(350); loadmod("Music/Mod.ChaosTheme42"); Delay(1); endmod(); Execute("run ram:ChaosDir/JCsound \"Sounds/Combat/Ghost\" -2 >nil:",0,0); Delay(11); WaitJCsound(); // This doesn't crash but the volume stuff doesn't work on medmods. StartMod("Music/Mod.ChaosTheme42",5); // song 5 is ONLY the artifact changing music. Delay(350); loadmod("Music/Mod.ChaosTheme42"); Delay(350); mvolume=0; // All this volume control stuff has NO effect on medmods playing=1; // because the medmod replayer code being used is not playervolume(); // not set up to handle volume changes! :( playing=0; playmod(); // or plmod() Delay(350); endmod(); Execute("run ram:ChaosDir/JCsound \"Sounds/Combat/Ghost\" -2 >nil:",0,0); Delay(11); WaitJCsound(); Perhaps make a an empty pattern to jump to? Blah. To much trouble. Then I can play song 0 but pattern jump to an empty pattern that makes no noise. Blah. To much trouble. I could simply StartMod("SomeStupidEmptyMod",0); That mod could either do absolutely nohthing or it could play an instrument on all 4 channels. But first it would set all 4 channels to volume 0! April 28th: The AC compressor in my car broke. It was making loads of smoke. Ack. I've only been driving the car for 3 months! I spent $1700 to buy it + $400 repairs (new brakes) the first day I drove it to work. Now I can either get a rebuilt AC system for $853.10 with 3 month warranty or a new one for $1153.79 with 1 year warranty. The _only_ good thing about this is I had to miss work on the 29th, 30th and 31st so I was able to spend all day fixing all Frédéric's bugs. ************************************************************************* Fri, 28 Apr 2000 11:19:21 -0700 (PDT) Bug report from Frédéric > Denotes the writing of Frédéric The responses are written by me (James Conwell) > * When an alliance is made, it should end at the end > of the game, but actually it is valid again for the next game. This is NOW FIXED. I beleive that setup options should stay the same from one game to the next unless you change them. > * The giant spider is said to be poisonous IIRC, but > it isn't. I don't remember it ever saying that. In the current version the spider is not poisonous and it doesn't say it is poisonous. > * You said in the readme that killing a generator > would give 4 bonus spells, > but I only got one (it was not a bipedal, aviary or > dragon nest, but a full-blown generator). Wow! Someone actually reads the readme! :) I think you must be about the only person to do such a thing :) You only get _1_ spell. But you get to pick it from a list of _4_ spells. This way your chances of getting a REALLY good spell are greatly increased. The only way to get to pick more than 1 bonus spell is to earn more than 1 bonus spell in 1 turn. This usually means you must kill more than one bonus monster/thing in one turn. There are other ways which I will leave for you to discover :) > * Abduction seems to be broken. It did work in v2.3d > but it v2.5d the abducted creatures became independent. I spent 20 minutes testing out Abduction and I found out that Abduction was totally broken! It didn't "immediately become independent again", it NEVER EVER changed the ownership of anyone ever!!! (unless you were player 1 and you abducted cell 1... or if you were player 2 and abducted cell 2 etc.) I always knew I hated the Abduction spell for some reason. Now I know why. Because it didn't work! I went back and checked v2.5 and v2.3 and the programming for Abduction was identical so it appears to have had the exact same bug as v2.71. > * (haven't tried yet with v2.5d) The turmoil spell > was broken in v2.3d: the > creatures were moved but somehow retained their old > positions by some > respects. And mounts were moved but not the wizards > mounting them (which > merely disappered and were still able to cast > spells). I wish you had reported this bug earlier! :) Someone beat you to it and reported this very bug a couple of weeks ago and I fixed it the next day. Turmoil was broken from the day it was implemented until v2.81. > * You say that Bahamut is unique but I've frequently > (when playing with lots of scrolls) cast several platinum dragons. Yes the description of the Platinum Dragon has always bothered me. It has never been unique despite what the description said. I've just been waiting for someone to complain about it to give me an excuse to fix it. I have changed the description to no longer say it is unique. NOW FIXED. > * When using charm, you could convince scrolls to > come on your side ! I can't imagine it's intended. hehehehe this is hilarious! After thinking about this a while I've decided to leave this the way it is so that way Charm has an extra secret use when playing in Exploration Mode: It can help you map out the level and show you where some of the scrolls are! Ok, I admit that it makes no sense to be able to "Charm" a scroll... but it does make the Charm spell more interesting. We'll just leave it like it is until more people form opinions on this matter. If anyone has an opinion on this matter please write me and let me know. It needs further testing in Exploration Mode. > There are many other little things I don't remember > at the moment but I'll note them down so I can tell you. Yes please note down any bugs or discrepancies that you find. I can't fix a bug if I don't know about it. If you don't write them down immediately, you'll forget them like I do :( You should keep your Cygnus Ed Professional running with a .txt file of possible bugs/weirdnesses/flaws. > Anyway Chaos is really a great game, and > I'd like to see an update! > ----- Bug Report Part 2: ----- > Now the things I wrote down today: > > * There is no difference between the effects of the magic knife and the > magic sword: both add 3 points of combat ability to the wizard and enable > him to attack undeads. I think the magic knife should not add combat > points, just be effective against undeads. This has bothered me for years. I just never got around to changing it. Today I have changed it so that Magic Knife gives only +2 combat and Magic Sword still gives +3 combat. Technically a Magic Knife should only give +1 combat and a Magic Dagger should give +2 combat. But I was afraid people might confuse "Magic Dagger" with "Poison Dagger" so I left the name of the spell as "Magic Knife" > * My gray elf is engaged to an earthquake ! I just cast "No grow" on that > earthquake to which my gray elf was adjacent. It's like it's behaving like > a creature, as someone just cast dark power on it ! :-) And another was > just brain-drained. Somehow they are still growth because "no grow" can be > cast a second time. But this attribute is not highlighted in the second > info panel. hehehe this all sounds hilarious! :) There is also another problem: If there is a sea of growth and you cast No Grow on a line of the growths to form a "wall" of non-growing growths then nothing stops the other growing growths from growing over the nongrowing growths. Doh! So I am changing No Grow to make the growth become inanimate as well as making it lose the Growth attribute. Growths don't grow over inanimate objects (except for the Earthquake) so now growths cannot grow over the things you cast "No Grow" on. And you won't get engaged to them now and you won't be able to cast Brain Drain or Justice on them either. NOW FIXED. * BUG: You can cast No Grow on something then cast No Grow on it again and again. This is silly and wasteful and not what I intendended. NOW FIXED. > * I think there should exist a counterpart to range boost: some sort of > "range drain"... Currently (v2.5d), only invulnerability or reflector can > save you from range combat. And it only applies to the wizard! I already added in a Range Drain Beam spell back in v2.7. You need to upgrade. > * The only way to add recovery to some attributes like intelligence or > agility seems to be the "touch of God" (or chaos lord :-) ). Why not add a > feature like you did for magical resistance: e.g. add some intelligence > recovery points if the brain boost is applied to a creature with max > intelligence ? Same for agility, combat, range combat, maybe others ? I will take this under consideration. > * When playing with many scrolls, sometimes a "radioactive land" scroll > appears. It has no description (empty screen) and any creature entering or > shooting in that cell dies. But it's labelled as a scroll. I fixed this today. Read below for more details. > * I can remember one time (with v2.3d) someone had cast "eye for an eye". > The manticore my wizard was riding killed a creature of that wizard, so it > died. But my wizard hadn't reappeared ! It could cast spells but was nowhere > on the board. I don't know if this bug is still there... Well I played a test game just now on v2.81 and my Wizard was riding a manticore and he killed the other wizard's manticore (which was being ridden by him). We both had Eye for an Eye. Everything worked perfectly. End Frédéric bug report. ************************************************************************** * BUG: Computer creatures will NEVER move onto a Pit Scroll or a Radioactive Land Scroll. NOW FIXED. * BUG: Computer creatures will NEVER shoot a Pit Scroll or a Radioactive Land Scroll. NOW FIXED. * BUG: Any creature moving onto a Radioactive Land Scroll dies. NOW FIXED. * BUG: Any creature moving onto a Pit Scroll dies. NOW FIXED. * BUG: Any creature shooting a Radioactive Land scroll dies. NOW FIXED. * BUG: Shooting a Pit Scroll says "Wasted Shot" and does not kill the Scroll. * BUG: When playing with Scrolls, sometimes a Radioactive Land Scroll appears. But Radioactive Land isn't even a real spell that can be cast. So I must either: A) Never allow a Radioactive Land Scroll to appear in the first place. B) Rewrite the Radioactive Land spell to be a "real" spell. What should I do? It is my belief that Sean intended that Radioactive Land should not be a "real" spell so I will simply modify the scroll code to never generate one. uhhh... what the hell.... There is already code to prevent spells of 0 probability being placed as scrolls. * BUG: QueryProbability() is BROKEN! It has never worked! It always returns the probability of the spell above it in the list! NOW FIXED! * BUG: SetProbability() is BROKEN! It has never worked! It always sets the probability of the wrong spell! NOW FIXED! * BUG: All saved game files have the wrong probability matrix saved in them. I DID NOT FIX THIS. New games will be saving the numbers correctly. The only reason spell probabilities were correctly displayed on the spell information screen is because the code was hacked to say: QueryProbabilty(spell-1); Note to Sean: Please please please don't write any more functions that require a real number - 1. Please make the functions require a real number instead of a real number -1. Please please please don't write any more arrays that require an index real number -1. Please make the arrays require a real number instead of a real number -1. If this means not using the 0th element then that is totally ok. The SpellProbability[] array is still off by 1. I only fixed the functions to take a normal parameter. Rewriting the SpellProbabilty array to use normal numbers requires rewriting various pieces of code that have lots of +1 and -1 convolutions due to the array being set up wrong in the first place. Leaving this for SAI to fix. Now that I have fixed those probability functions, Radioactive Land Scrolls and other 0 probability spells will not be showing up anymore! ???: I moved my Dire Wolf to within 3 squares of a Ghast and yet my Dire Wolf did not smell him!! He was _exactly_ 3 squares away. OK, this is because the Dire Wolf's smell requires line of sight and the intervening unexplored squares block line-of-sight. So actually it is technically working the way it is supposed to. I could change it so that the Dire Wolf's sense of smell does not require LOS. This would make it more realistic when there are empty unexplored squares between the wolf and the other creature. But it would make it less realistic if there were 2 solid walls between the wolf and the other creature. This would be easy to do. I could change it so that the Dire Wolf's sense of smell requires LOS but the LOS checking could be changed to use what is REALLY in the cell. Thus it would ignore empty unexplored cells. This would require real work...hmm... If anyone has any opinions on this subject then please let me know. * STUPID: The computer cast Combat on a Bolter Wall! NOW FIXED. If the Bolter Wall was an inanimate object in the first place, none of these Bolter Wall bugs that we've had over the years would have ever happened. * BUG: My dragon killed a wizard who just cast some trees. The game made the death sound of a dragon for each tree that then collapsed. (8 times). This is because I was using isDragon(id) instead of isIDdragon(id). NOW FIXED. * BUG: Mass Morph is broken! It _ONLY_ morphs generators! I have changed it to morph all creations EXCEPT generators. NOW FIXED. * FLAW: Casting Mass Morph on something belonging to Nobody results in all empty cells being morphed into Magic Wood Trees. NOW FIXED. * BUG: Sometimes the growths of dead wizards are growing all over the board. Explanation: a wizard cast some trees on some fire and other growths. When he dies all the visible board is put to sleep. Then the trees explode, thus causing those growths to go back to the visible part of the board. In this manner the growths owned by the dead wizard escape being put to sleep or silently removed. NOW FIXED. * NEW BEHAVIOR: I don't know if anyone ever noticed or not but it used to be that when a wizard died, most of his buried creatures were silently removed. I have now changed this so that they are merely put to sleep. * COMPRESSION of Saved Games implemented using lha. From now on when you save a game as "Blah" it is lha compressed into Blah.lha. Attempting to load a .lha save file autodecompresses it. This saves about 70k per save file. Before Compression : After Compression JamesConwellLevels: 222556 9573 SAI_Levels: 667618 29236 Total: 890714 38809 SAVED 851K!!!!!! Tuesday May 16th, 2000 I've been ripped off at my job each day for several days now. I have been extremely stressed out for over 1 week now and have done almost nothing. Today I talked to an attorney and I finally calmed down enough to be able to do some coding: * AUTOSAVE FEATURE IMPLEMENTED: This feature defaults to ON. It will save the game automatically on EACH human wizard's turn. Each save is done into a different filename. Example filename "004p8AutoSave.lha". This means that this is the savefile for turn 004, player 8's turn. The turn number is first so that the files will list in numerical order in the filerequester. From now on if you find a horrible bug that crashes the machine or something you can ALWAYS go back to your last saved position (Because it is saved automatically). You can then replay the turn over and over again to figure out exactly what it is that is triggering the bug. This should greatly benefit playtesters the world over. * IMPLEMENTED all of Frédéric's spell-description corrections/clarifications for all spells beginning with the letters A-E. =========================================================================== * BUG: Disrupt drains the intelligence of creatures which are your allies. NOW FIXED. This seems like a good time to vote on the Disrupt spell: This spell causes a momentary lapse of vision in all enemy creatures. It can prove fatal to weak minded creatures and causes permanent damage to the cerebral cortex of those that survive. This spell currently does not affect wizards, growths, inanimate objects or scrolls. Frédéric has proposed that Disrupt should be changed to affect wizards. Do you have an opinion on this? You can vote for, against, or no opinion. Or whatever you want 8) New Zealand makes this statement: My general opinion is that it should be difficult to kill wizards with "at a distance" type spells. I know there are other execeptions to this already, e.g. curse. However, since the disrupt spell is relatively rare, I don't see a problem with making the change. It is definitely best to have it not affect growths, since otherwise it would kill most of them. Hungary has this to say: After I've searched what does it mean the "cerebral cortex" expression, my opinion is the follow: If it is the same like brain drain, but it has effect on the whole playing area, I say: OK, let it has affect on the wizards and all object (all means EVERYTHING). Let's rise up the CHAOS!!!! JC replies: Since the description says it affects the cerebral cortex it should only affect creatures. Inanimate objects and growths do not have a cerebral cortex. Technically this spell should not affect the Robot, but that is an issue for another time 8) I feel that since the spell does not require line of sight and since it already affects huge numbers of enemies I am mostly against applying its damage to wizards. If you are playing a game against 7 enemy wizards and each wizard has 4 creatures on the board then casting Disrupt will damage 28 enemy creatures! Isn't that enough? Also you don't have to pick a particular enemy to damage. It just damages ALL enemy creatures. Therefore I am mostly against the proposal. However, since the spell only does 2 points of damage to intelligence combined with the fact that it is very rare, I'm not totally against it. Thus I vote -.75 points. France votes FOR this proposal: +1.0 point New Zealand votes Neutral/For this proposal: +0.5 points Ireland abstains: 0.0 points USA votes +1, -.75 +0.25 points ------------------------------------------------------------- TOTAL: +1.75 points Proposal Passes and is implemented on May 20th, 2000 ========================================================================== * Created a MakeDemoOfChaos.txt AmigaDos script file to copy all the files needed to create a playable Chaos distribution into a Chaos/ dir. I actually used this to make a registered version of Chaos 2.81. DONE. Version 2.81 installed on JJ's computer on Monday, May 22nd, 2000. END OF VERSION 2.81 BEGIN VERSION 2.82 International Language Version. * IMPLEMENTED all of Frédéric's spell-description corrections/clarifications for all spells beginning with the letters F to Z. Including complete rewrites of Magic Attack, Magic Bolt, Ice Breath, Lightning, X-Ray and Fireball. DONE. * CHANGED Pythons so they attack Life Force + Manuverability. * ADDED a new "Language" menu option with English, Français, Hungarian, Deutsch, Espańol and Italiano options. All options are mutually exclusive. * BUG: Hold down the RMB. Now select any language then select another language (DO NOT RELEASE THE RMB DURING THIS TIME). The 2nd language you selected will be correctly highlighted and the 1st language will be correctly unhighlighted. But internally the program still only knows that you selected the 1st language, thus the Language variable is now set to the WRONG value! Ok, after some hours studying the RKRMs I worked out how to handle multiple selections in 1 MenuHandler() call. NOW FIXED. * Above fix has hopefully now prevented numerous other Menu problems from ever happening. * ADDED some text to print when a promotion happens. * ADDED some text to print when an Orc/Goblin/Troll gets a bow. * ADDED some text to print when the game is AutoSaving. ------------------------------------------------------------------- JJ complaints on May 25th, 2000: 1: Range Boost didn't work on his Wizard with a Magic Bow. NOW FIXED. 2: He doesn't like the digital sound effects and wants a "Combat Sounds" on/off feature. This took me 2 hours. 1 hour to do it and and 1 hour to debug it due to lame C STUPIDITY. I wrote IF (MENUCombatSound) and the compiler generated NO ERRORS! But there is no variable called MENUCombatSound!!!!! And it didn't call the FUNCTION MENUCombatSound() either! It just always evaluated the nonexistent variable as TRUE so the sounds were ALWAYS ON no matter what I did. NOW FIXED. 3: The graphics on the info panels on his A3000 are in different proportions to the graphics on the main screen. He doesn't like this. This is due to limitations of the A3000 graphics chips, sorry. You can either: A) Redesign all 1000 graphics in the game by doubling their size vertically and then hand editing them to smooth out the resulting blockiness. Assuming you can edit 5 graphics per hour this should take only 200 hours. B) Buy an Amiga 4000 or a suped-up Amiga 1200. ------------------------------------------------------------------- * INTERNATIONAL LANGUAGE SUPPORT ADDED! (Only for Spell Descriptions) IT WORKS GREAT! Currently the only languages supported are English, Français and Hungarian. The font still needs to be edited to contain accented characters, this is Frédéric's department. * ELIMINATED all those stupid spell+1 and spell-- and spell+=1 constructs from SpellInformation(). This was all caused by PoolPos requiring a spellnumber-1 instead of a real spellnumber! NOW ALL FIXED! * ENFORCER HIT BUG! Selecting "Scores" from the Menu somehow corrupts the value of the Global Variable "Language" and sets it to 8. Then anything that uses the Language variable to access an array triggers off enforcer hits. Hmmm... this was all caused by a missing break; after a END_SWITCH. I guess most END_SWITCH statements need a break; after them. * Wolverines now scavenge +3. * Achiyalabopa now needs LOS for its sight range due to the fact that it is "low-flying". * Wednesday, May 31st, 2000: Installed version 2.82 onto JJ's computer. My optical drive got tons of write-errors and it was a major problem to copy the game onto it. I don't know what I will do for the next version :( BEGIN version 2.83: Continuation of International Language Version. * Hidden Horror + Reincarnation Bug Report by Frédéric: I had cast reincarnation on my hidden horror so as to get a golden dragon when it came close to that combat-enhanced enemy wizard (like this is said in the hidden horror description), but I only got a red dragon. NOW FIXED. * Added in some code to read in all the catalog files. To preserve file attributes on extracted lzx files type the following: lzx -a x filename lzx -a x filename dirname * REPLACED most of the text in the game with an appropriate call to Message() which gives the correctly translated string according to the currently selected language. * PROOFREAD, corrected & edited Frédéric's new doc sections on creature statistics and spell statistics. ========================================================================= Begin Catalog Translation Problems ========================================================================= Ok now I've had some serious problems over the last few days. #1: French grammar is backwards when compared with English grammar so my catalogs are useles. But the solution is VERY easy, simply make use of the new sprintf() (or related) routine in the Amiga OS that allows the translator to switch the orders of the parameters around using positional notation such as %1$s %2$s %3$ld. #2: Well great, the only way I can figure out to use the new sprintf in Amiga.Lib instead of the SASC sprintf is to link with Amiga.lib first. But this is TOTALLY unacceptable because then the Amiga.lib printf would replace the SASC printf and the amiga.lib version is totally bugged and lame and worthless. #3: Amiga.lib sprintf doesn't support many of the features of "real" sprintf routines in C compilers. For example it doesn't have floating point support. :( #4: Amiga.lib sprintf is lame and expects 16-bit ints. Ack. So all %d and %c must be changed to %ld and %lc to compensate for this. SOLUTION: #1: We will have to continue to use the SASC sprintf for floating point formatting and possibly other types of formatting. The sprintf statements using floating point will have to be broken apart into multiple steps. Fortunately there is only 1 place in the game that uses a floating point number in a translation string. So this will be dead easy. The other floating point uses of sprintf are purely numerical and will not be translated in a catalog file. #2: I will implement a new JCsprintf routine which uses the totally cool positional notation of AmigaOS RawDoFmt() and amiga.lib sprintf, etc. I thought about calling it Sprintf but I figure we might get them mixed up, I couldn't really decide what to do about this... Maybe we should call it Tsprintf since it is only required for use with strings which are being translated from 1 language to another. #3: This new Tsprintf routine is simply an asm routine that calls RawDoFmt() with a function parameter to store the chars in a buffer. WHY OH WHY doesn't RawDoFmt() default to sprintf string-storing when supplied with a NULL function parameter? This asm routine came straight out of the RKRM example listed under RawDoFmt() This should solve all the _current_ translation problems. Other translation problems will be dealt with later. * I went through and added numeric positioning information to EVERY string that had more than 1 parameter. * I basically copied the prototype from sprintf() in stdio.h to use as the prototype for Tsprintf(). Though first I compiled the game as a test with no prototype for Tsprintf() and no warnings or errors were generated! I assumed the game would just crash so I didn't try to play it like that till added the prototype and did smake clean smake. ========================================================================= End Catalog Translation Problems ========================================================================= -------------------------------------------------------------------- Begin Handling Translated Spellnames -------------------------------------------------------------------- Decide how to handle spellnames? Why not handle it exactly the same as I handle Message(); ? Yes, exactly like I handle Message, excellent. Ok, but how do I read them in? If I could somehow make a list of all English spellnames. This is easy duh. I have a list of all English spellnames. Its built into the game! creature_name[]!!!!!! IF (the date of the directory "SpellDescriptions/English" > the date of SpellDescriptions/EnglishSpellnames.txt) THEN just do "list SpellDescriptions/English/ quick files nohead >SpellDescriptions/EnglishSpellnames.txt" I now have a .txt file of all English spellnames. END_IF // ALL DONE NOW. I just copied code from handling the sound effects. Above paragraph is all useless! I need French names of OBJECTS in the game, not french names of english names. Now go through each name in the this list and open up that filename in each language/ dir and dig out the language/ version of it and put it into an array! Easy! DONE. * Make a CreatureName() macro that returns the creature_name of the creature in the currently selected language. DONE. * Go through the entire game and replace all appropriate occurrences of creature_name[x] with CreatureName(x) except the ones in editor.c. I'll worry about that later. Certain occurrences of creature_name[x] specifically must NOT be replaced because they are dealing with files (sound files, text files, etc.) and those files must always be named according to their english name. DONE. Check the date of the LanguageSpellnames.txt against the date of the dir Language/ If the dir is newer then it means something has changed and the text files must be rebuilt. So if the Language/ dir is newer than the LanguageSpellnames.txt file or the EnglishSpellnames.txt file or the English/ dir then it must be rebuilt. Additionally, if the English .txt file gets rebuilt then they must ALL get rebuilt because it might mean some new spells have been added. So in the end I'll end up with a 350 line FrançaisSpellnames.txt and a 350 line MagyarSpellnames.txt etc. Line 1 is the translated name of object 1. Line 2 is the translated name of object 2. etc. * PROBLEM: It takes several seconds to open/read/close the 350 files required to read in the translated spellnames. (And its only doing Français now! That will be over a whole minute when all languages are done.) So I optimized it such that the list only needs to be rebuilt if someone has changed something in one of the descriptions. NOW FIXED. * TRANSLATED SPELLNAMES ARE NOW FULLY FUNCTIONAL. -------------------------------------------------------------------- End Handling Translated Spellnames -------------------------------------------------------------------- * Changed "Hungarian" -> "Magyar". ---------------------------------------------------------------------- Email from Frédéric "Frédéric's Folly" :) ---------------------------------------------------------------------- Too bad my stupid screen grabber overwrote the screen grab I made earlier, it was very impressive ! I played with 30 scrolls and my wizard appeared next to a fir with combat on his spell list. With the help of a stone giant I destroyed the tree and it revealed a Chaos lord spell !! I cast it then replicated (with triple active) myself. I destroyed 4 generetors and 2 enemy wizards in only one turn :-) !! I had to pick 6 spells among a big list, and there was 1 Generator and 2 touch of God spells in it ! I was awesomely powerful. Then I made a stupid mistake. One of my replicates got burried by an orange jelly. I rescued him but forgot he was only at half of his _initial_ strength. He got killed by a stone golem next turn. And it was my main wizard so I lost. One thing I don't understand is how it is decided which wizard is the casting wizard. It seems to change each turn. Is it random ? Reply from JC: The spell description warns that casting Replicate on one's own self can be very disorienting. It means what it says. 8) ---------------------------------------------------------------------- End Email from Frédéric ---------------------------------------------------------------------- * June 13th, 2000: Received Patrick's 2nd registration from Ireland. YAHOO! Compiled v2.83 and Emailed it to him on June 15th, 2000. The actual size is about 8.18 megs. The .lha archive size is about 5 megs and the email size is about 6.6 megs. * June 17, 2000: Received Frédéric's registration. He is now inducted as a junior member of Team Chaos and assumes all privileges and resposonsibilities associated therewith. He is also Chief Executive Vice President in Charge of Français Translation, Français Font Editing and also English and Français AmigaGuide Electronic Hypertext Documentation. Saturday, June 17th, 2000: I loaded my very first IFF graphic file into the game and displayed it. AMAZING! All these years I've never once loaded a graphics file into one of my programs! Though I have loaded IFF _sound_ files for many many years. ********************************************************************** Bug Reports from Frédéric: ********************************************************************** * Saving does not work ! I launched Chaos from the shell and got messages like c/lha: unknown option - 3 each time the game tried to save the current game (either autosave or requested save). I've finally found why lha complains about the -3 option: it was in my ENV:LHAOPTS file, to automatically select the best compression algorythm. However, the old lha version supplied with chaos does not know of this option. The ideal solution would be that you use the -I option when you call lha from Chaos, this will cause lha to ignore the LHAOPTS environment variable. JC: Ok, I changed lha to use -qaI when being called from Chaos. NOW FIXED. JC>> * I tried to reactivate the lhaopts environment variable but the JC>> problem about -3 option arose again. Maybe you should put the -I JC>> option before all other options and alone on its dash. JC> Please try using the lha that is in chaos/c/ and figure out how to make JC> it work. JC> Just type it from the shell and try different options and settings JC> until it works properly. Then let me know which combination of things JC> worked and I'll put it in the program. When I say "c/lha" I get "invalid option -3". When I say "c/lha -I" I have the usage summary. I said "c/lha -Ir a ram:ChaosTest.lha AmigaToPAL" and it worked. I think the problem is that you mixed options and commands. -Iq are options, a is a command "add", not to be mixed with the -a option (preserve file attributes). So the following will work: c/lha -qaI a xxxAutosave.lha ChaosSavedGame (at least it should). Drat ! I tested it and it doesn't :-( Okay, when I move -q aside it works: c/lha -aI -q a xxxAutosave.lha ChaosSavedGame JC: Ok I have now implemented the above line into the autosave code of the game. It doesn't work! Lha keeps warning me that the "I" option must appear immediately after a - and before the archive name! c/lha -I -aq a xxxAutosave.lha ChaosSavedGame NOW FIXED. * I cast abduction and it abducted a poison dagger scroll ! And it did reveal itself as I was trying exploration mode :-) JC: NOW FIXED * The proportionnal font you use in the info screens does not know of accented letters !! This makes french descriptions for spells totally unreadable ! For example "Dévastation" becomes "Dvastation" ! JC: I know all about this. You are in charge of translation so you are supposed to fix this. NOW FIXED. * The special combat ability provided by Aesculapius does not target anything ! I think special combat should have a default stat target even if the creature has no special combat at all (like range combat). Moreover this special combat targets my own creatures too ! JC: This was a simple problem of not enclosing my #define in () NOW FIXED. Aesculapius no longer gives people Special Combat. * "Independent vulture eats some brown bear cadaver. Life +d" Seems the %d thing does not work. JC: This is a problem with that stupid OS sprintf not working with long parameters. It only works with words! It has already caused me many many problems and this is the whole reason why it took me soooo long to do the translation coding. Anyway this particular sentence is NOW FIXED. * I got this error message too: ChaosDigitalSoundSubProcess : erreur code 150 JC: You can ignore this one. All it means is that Chaos tried to play a sound effect when there were no channels available (like when the music was playing). If music had been off at that moment, the sound would have played. The actual error message is generated by the OS and there is no way for me to suppress it. * I've found another minor bug: when I cast alternography and restart the game, the alternography is not reset and remains active. JC: NOW FIXED * "Asleep's wizard munches on some manticore's cadaver. Life +d." Asleep's wizard ??? This should not exist (it is not a fake wizard)! Moreover, asleep creatures should not eat anymore ! JC: Well, there was a bug whereby any scavenger that was asleep or dead or a scroll would still scavenge any dead bodies that it was on top of. NOW FIXED. -------------------------------------------------------------------------- * Providing someone with a telescope does not increase his mapping of his own position in the world until he moves. Too bad if that creature is engaged. Maybe the telescope spell should update the explored cell for the recipient creature. This update should also happen when a creature blocking line of sight moves, revealing some parts of the world. Maybe a good place to do this is board update. Reply from JC: #1: Its a rule: if you are engaged then you can't map the world. You are too busy defending yourself to have time to draw maps. #2: Furthermore its a rule that if your creature doesn't move then it doesn't map anything. Thus, a creature that never moves will never map anything. #3: I have been thinking of changing the Telescope and Seismology spells such that they give results immediately upon casting. Since you asked for this I went ahead and implemented it. So from now on if you cast Telescope or Seismology you will IMMEDIATELY (in the casting phase) map new areas. -------------------------------------------------------------------------- ********************************************************************** End Bug Reports from Frédéric. (Is there ever an end? 8) ********************************************************************** * FIXED description of Solar. * CHANGED: Aesculapius scrolls are now always buried. * CHANGED: Touch of God, Chaos Lord, Iridium Horse and Aesculapius scrolls are now only 1/3 as probable as other scrolls. * END of Version 2.83 * BEGIN Version 2.84 * CHANGED Cartography to immediately explore the cells during the casting phase in the same way that I already changed Telescope and Seismology. * INSTALLED the new ChaosCalligraphy.font which has been modified by Frédéric to include (all?) international characters of Western European alphabets. Most notably żĄńŃ éčęëć ÉČĘËĆ çÇ etc. ********************************************************************** Bug Reports from Frédéric: ********************************************************************** > * I cast betrayal on a bolter wall and it said the spell succeeded. But the > bolter wall still belonged to the same player. JC: This has always been possible. If Betrayal succeeds then a new player is randomly chosen. In your case it randomly chose the same player as before. I have now changed it so that if the spell succeeds then the target _WILL_ change owners. NOW FIXED. > * Sometimes the old EndOfTurn sound is played at the end of a turn, instead > of the sound from file "EndTurn.8svx". I did not find a condition for this > to happen. JC: This happened only when someone had previously cast Move It. NOW FIXED. * When I begin a game in exploration mode (as player 1 or 8, never mind), the position of player 3 is shown to me before disappearing again. ? JC: This one took me a while to figure out. In the beginning of the game I changed the PlayerView to 15 so that way absolutely nothing would be shown since there is no player 15. But the Team[] only has 12 elements! (0-11) so Team[15] was actually accessing into TeamSettings[3] (which keeps a backup copy of the team settings so that alliances and seperations don't mess up the setup screen) Of course TeamSettings[3] is going to equal 3 unless you change the Teams on the setup screen. So the game thought that player 15 was on Team 3 and thus would show you player 3's position at the start of the game. So how do I fix this? A: Expand the Team[] and TeamSettings[] array. This requires a change to the savegame format and I would have to convert all the old levels to the new format. B: I could just not change the view to be 15 at the beginning. I could change it to the 1st human player, (since he will get the 1st real view anyway) or I could change it to the DEADP player. Option B is easiest. I will just change the view to the DEADP player. This will work perfectly until the game starts randomly distributing dead bodies across the map at the beginning of the game. This will probably never happen so it should never be an issue. NOW FIXED > * A question about something I wanted to test but I didn't have the right > spells on my list. What does an inanimate object becomes when it has been > hit by stone to flesh and reincarnate, and then dies ? Does the > reincarnation scheme take this into account ? JC: I tried this and it worked. It said R=0 meaning that it doesn't reincarnate into anything. I then killed it and it died as usual. Nothing messed up, no crashes, my computer is still running. 8) > * I cast the cat lord, and I had already a lion. I was able to control the > lion and attack a harpy with it. Then, after I clicked end-of-turn, the cat > lord controlled the lion and attacked the harpy again. NOW FIXED. > * My wizard has scavenge +4 but does not scavenge the harpy cadaver he's > standing on (autosave 020p8). Ah ! I see. Scavengerism is only for > creatures with a life force below its initial value, right ? Correct. > * Another wizard has scavengerism and it works. But he's cloaked and the > sentence say he is a wizard munching on some brown bear carcass. I think it > should say "cloaked creature" instead of wizard. NOW FIXED. > * A leopard corpse mewed when it was destroyed by a fireball ! Corpses > really shouldn't make any sound :-) NOW FIXED. > * I'm able to control the solar and make it attack before it attacks on his > own ! NOW FIXED. ======================================================================== BEGIN HORRIBLE LOCKUP BUG WITH "Repulsion" sound. ======================================================================== * Sometimes the game locks up and makes the Repulsion sound. JC: This same bug was reported by JJ several times over the last few months but the details were so sketchy that I had no way to track it down and fix it. 10 days later after countless hours of playtesting by Frédéric using the JC modified version of Chaos which generates logfiles of its actions, I was _finally_ able to track down this horrible bug!! // Begin code copied from CellEffect(); case TELEPORTIN: ObtainSemaphore (&BoardLock); FOR (i = 0; i < 8; i++) DO IF (i != 7) THEN SetAPen (rastPort, WHITE); Move (rastPort, x + i, y + i); IF (DrawIt) Draw (rastPort, x + CellWidth - i, y + i); AUDIONote (2000 - i * 100); IF (DrawIt) Draw (rastPort, x + CellWidth - i, y + CellHeight - i); AUDIONote (1000 + i * 100); IF (DrawIt) Draw (rastPort, x + i, y + CellHeight - i); AUDIONote (2000 - i * 100); IF (DrawIt) Draw (rastPort, x + i, y + i); AUDIONote (1000 + i * 100); END_IF IF (i != 0) THEN SetAPen (rastPort, BLACK); Move (rastPort, x + --i, y + i); IF (DrawIt) Draw (rastPort, x + CellWidth - i, y + i); IF (DrawIt) Draw (rastPort, x + CellWidth - i, y + CellHeight - i); IF (DrawIt) Draw (rastPort, x + i, y + CellHeight - i); IF (DrawIt) Draw (rastPort, x + i, y + i++); END_IF NEXT // i++ ReleaseSemaphore (&BoardLock); break; // End code copied from CellEffect(); Notice that it always decrements i (i--) but it only SOMETIMES reincrements it (i++) As i happens to be the loop control variable, decrementing it once per loop = an infinite loop! I spent hours looking through the code for constructs like this!!!! I SPECIFICALLY looked for ANY FOR NEXT loops in which the loop control variable was changed via i++, i--, --i, ++i, or i+=x or i-=x. But I didn't look in cell.c because I thought the problem was either in chaos.c where the recovery code is or in core.c where tons of low-level routines are at that get called millions of times by chaos.c. NOW FIXED. What the actual bug was: Basic Explanation: Anything that caused the TELEPORTIN or TELEPORTOUT cell effects to be used would lock up in an infinite loop making sound. Since a simple sound played in a loop is what the "Repulsion" sound is, this sounds very similar to the Repulsion spell sound. Specific Explanation: IF you were playing in exploration mode and any of the following things happened then the game would lock up. A) A roper teleported to a new location. B) A creature changed sides due to impurities. C) Any Wizard used the Passage spell. D) Any Wizard used the Teleport spell. E) Any wizard cast Pyrotechnics or Storm and it actually hit a creature. F) Any Haunt spontaneously changed sides. G) Any Wizard cast the Pox spell on something. NOW FIXED!!! So the reason the lockup bug seemed to only happen when you played with lots of enemy wizards and with growths on the screen was because, the more stuff on the board, the more of a chance of Impurities causing an alleigance change. ======================================================================== END HORRIBLE LOCKUP BUG WITH "Repulsion" sound. ======================================================================== * BUG: When I'm in alliance with another wizard, I can see the regions he has explored. However, when a creature is moving in these regions, it is not highlighted. JC: This bug was a simple typographical error in the code. NOW FIXED. > * About the bug in inamorphobiosis you fixed. I thought the same problem > could arise when a wizard mounts a cat (lion, jaguar etc) thanks to "Mount" > and another player casts the cat lord. Did you consider this case ? JC: I just changed it so that Cat Lords cannot take control of mounted cats. NOW FIXED. > * After Joker, I got "Wizard 7" on my list ! Is this normal ? JC: Well, the way Sean programmed it, it could give you any spell, even spells with 0 probability. I have now changed it so that it will not give you spells of 0 probability. NOW FIXED. You also reported months ago that you were able to get a Radioactive Land spell on your list by casting Joker in v2.5. This was a symptom of the exact same bug and is also NOW FIXED. > * I had triple in effect and my marid cast violet fungi. It logically cast > it three times, but all at the same place, one on another. This should be > considered stupid ! JC: NOW FIXED. > * I first got Burstroem's Browser today. I cast it and began to peek at > other wizards spell lists. When I play with Texas Trash'em, I can peek at > others spell list when I have already picked a spell to cast and the game > is waiting for me to discard another one. However, when I get back to my > list, the spell I had picked to cast is displayed again. JC: NOW FIXED. > * When a growth is hit with "No grow", it becomes inanimate, so the > animation should be stopped. JC: NOW FIXED. ********************************************************************** End Bug Reports from Frédéric. (Is there ever an end? 8) ********************************************************************** * CHANGED: Each Wizard now has a unique name! Instead of 8 creatures with the name "Wizard", we now have "Wizard 1", "Wizard 2" etc. This was neccessary so that each wizard can have its own unique sound files and graphic files. * BUG: A scroll of a Cat Lord takes control of the cats and makes them belong to NOBODY! NOW FIXED. * CHANGED: Inanimage is now only half as likely to cast Inanimorphobiosis or Mass Petrification as he is likely to cast any of his other spells. Sent new version of 2.84 to Frédéric for playtesting on July 5, 2000. * CHANGED Ghoul: The description of the Ghoul says that it feeds on others so I have now changed it so that it has Exophagy and +2 Scavenging as per Frédéric's request. ********************************************************************** Double-Attacking Bug Reports from Frédéric: ********************************************************************** >>> * A floating eye belonging to one of my computer allies was hit by >>> singular earthbind. It moved close to an enemy and attacked it... two >>> times ! > * The ghoul in cell (3,3) attacked the independent generator twice !!! This > is the first time I see this ! Autosaves 27 and 28. It did it again on turn > 28 ! > * Another ghoul, in the upperright corner, attacked the adjacent ogre > assassin twice ! Autosaves 39 and 40. It just killed the ogre now and got > back to its original place. So it really gets two chances to move! Yes quite right. Any nonengaged computer-controlled creature with >10 movement points could move twice! NOW FIXED. ********************************************************************** End Double-Attacking Bug Reports from Frédéric. ********************************************************************** * BUG: Independent creatures and the creatures of computer-controlled wizards get to move and/or attack twice if they have more than 10 movement points and are not engaged. NOW FIXED. * BUG: Independent creatures and the creatures of computer-controlled wizards accrue approximately .24 free movement points for each diagonal movement made. NOW FIXED. * BUG: A computer-controlled wizard who is mounted on an inanimate object (such as a centaur that has been hit with Flesh to Stone) can still attack and shoot if the centaur is "engaged". NOW FIXED * BUG: Animate affects scrolls of inanimate objects! NOW FIXED! ********************************************************************** Bug Reports from Frédéric. ********************************************************************** > * I cast "no grow" on my own gooey blob so that I get many creatures when I > subsequently cast "animate". However, it didn't work: I still have my > petrified gooey blob. We should either: say the spell only works for trees, > or make it affect more inanimate objects (including those petrified by > flesh to stone, for example make them creatures again). JC: I changed it so that now Animate affects petrified growths. NOW FIXED. Also it didn't affect Ropers. Now it does. > * When the mount of a wizard is killed, it leaves no corpse behind. JC: NOW FIXED. > * When a creature kills a growth covering a scroll, it does not move over > the scroll. JC: NOW FIXED. > * Desire: on the second setup screen, add the GFLG_TABCYCLE (cf > Intuition/Intuition.h) to the string gadgets so that one can move between > all the string gadgets without using the mouse. JC: DONE. I also implemented it on the 1st setup screen. TABCYCLE feature added in honor of Frédéric Delacroix, who earned the "Playtester of the Month Award" for June 2000. > * Suggestion: Convert could be cast on the inanimate so that it can be used > to destroy dark wood. (An enemy of mine is an arborist and cast a line of > dark woods close to me). JC: DONE. Convert spell description updated. > * There is an independent solar but it never moves or attack ! JC: NOW FIXED. Tested and works perfectly. ********************************************************************** End Bug Reports from Frédéric. (Is there ever an end? 8) ********************************************************************** ---------------------------------------------------------------------- - Begin Font Bugs! ---------------------------------------------------------------------- Font in start/quit gadgets is wrong. It is using a system default font. Font in Menus is wrong. It is using a system default font. Font inside the filerequester is wrong. It is using a system default font. Font in text gadgets on setup 1 is Topaz! If the system default font is really HUGE, as it might be on an Amiga with a 1600x1280 gfx card, then the gadgets are really messed up and the menus look HORRIBLE and the menus corrupt the screen gfx. The gadgets and menus are programmed to ask for an 8 point font and they expect to get it. If the font is not 8 points then bad things can happen. Ok I just added the following line to the OpenScreenTagList() of the main screen: SA_Font,&PearlFont8textAttr, THIS DID NOT FIX THE BUG! I have now tried multiple other ideas. None of them had any effect whatsoever. :( I conducted various experiments and had no luck whatsoever. So then I spend the rest of the day discussing this problem with various Amiga Programmers and _FINALLY_ Drad figured out the problem and conducted some experiments to prove what was going on. 1. OpenDiskFont() can handle, and really should have, a complete pathname in the TextAttr struct. "ChaosGame:fonts/pearl.font" works perfectly. 2. But when using that VERY same TextAttr struct in a menu or a gadget, it will fail 100% of the time due to a "bug" or "improperly documented feature" of Intuition. When supplying TextAttr's to ANY intuition function, there MUST be NO pathname component whatsoever! And the font MUST exist in memory! Only the actual name of the font may be supplied. So the solution is to have a PearlFont8TextAttrForOpenDiskFont that says "ChaosGame:fonts/pearl.font" and a seperate PearlFont8TextAttrForIntuition that says "pearl.font". NOW FIXED. ---------------------------------------------------------------------- - End Font Bugs! ---------------------------------------------------------------------- Sent yet another new version of v2.84 to Frédéric for playtesting on July 12th, 2000. It took approx 41 minutes to compile on my 25Mhz 030. ********************************************************************** Bug Reports from Frédéric. ********************************************************************** > * It seems to me that growths eventually stop growing, sometimes after a > single turn. JC: NOW FIXED. > I have noticed very recently > (between 2.83 and 2.84) that some growths tend to stop growing very rapidly. > I once cast an orange jelly and it never grew at all ! JC: NOW FIXED. > Sometimes Hippocrates or Aesculapius randomly kills one of my creatures > with his healing Special Combat. JC: I finally figured this out! It happened randomly because it was caused by the Impurities code! Here is the offending line of code: IF (Impurities and MSGRandom() % 800 < 2 and !isExposedWizard(defence)) combat=50; I rewrote it thusly: IF (Impurities and MSGRandom() % 800 < 2 and !isExposedWizard(defence)) THEN IF (combat >=0) THEN combat=50; ELSE combat=-50; END_IF END_IF So the real bug was: * BUG: With Impurities turned on, healing special combat sometimes kills the creature being healed! NOW FIXED! > * When a creature raised from the dead is covered by a growth and then > uncovered, it is living again ! This is according to the rules of Chaos. If you search the docs for "covered by a growth" you will see the rules pertaining to this matter. > This is not normal ! Being undead is not normal! If you don't want this to happen then you _must_ kill the growth yourself before it dies of natural causes! > * When a cloaked wizard who as scavengerism is scavenging a corpse, it says > "Wizard 4 munches on a corpse of cloaked creature" ! This was a simple matter where I switched my variables. NOW FIXED. > * Sometimes when a wizard is "killed" by justice/vengeance/exorcise in an > unexplored region and is reinstated, his position is revealed (the cell he's > in becomes empty for the duration of the "bonus spell" sound). This was a bug whereby DrawCell(&NothingImage,cell); was being used instead of the correct ReDrawCell(cell); DrawCell() just blindly draws graphics into cells without taking into account exploration mode. ReDrawCell() knows about exploration mode and acts accordingly. NOW FIXED. > * The wizard that wouldn't die bug: > > Wizard 5 has 1 life point and -2 recovery. Each time he's attacked, it dies > (allelujah sound, but no wizard dying sound). The cell is left blank but the > wizard is still there if I move the mouse pointer over it. It can be > attacked again and the same happens. The cell is eventually refreshed and > the wizard reappears. I think he cast Lich lord during his first life but > the lich lord icon is not in the list of his powerups now. He was killed at > least 15 times by the independents ! > > Autosaves 15,16,17. Ok, this had nothing to do with Lich Lord. This was caused by the fact that the wizard had cast Horror on himself. Each time he was killed the Horror code kicked in and tried to replicate him, but there were no empty adjacent cells. So he wasn't actually replicated and the Horror was not actually used up and he didn't actually die. I have now changed it such that: 1) If this happens again, the Horror gets used up. So it will only happen once. 2) It now prints a text message and does a graphical effect to indicate that the Horror process is happening. 3) It sets Life, Magic Resistance, Intelligence, Manuverability and Combat to maximum. Move gets set to max(CurrentMove,InitialMove). This is to make up for the fact that it didn't get to replicate. NOW FIXED. Tested and works ok. > * ????!? The wizard that wouldn't die died on turn 18 ! It was during > boardupdate so I guess the giant rat bite did it. The wizard who wouldn't die after being attacked multiple times by green and golden dragons + tons of other creatures ended up dying by a simple rat bite. > * When the independents (but it may also happen for other teams, I don't > know) kill a wizard, the word "Independents" at the bottom of the screen is > erased just after the dying-wizard animation, and the movement phase > continues without "Independents" to be reprinted. NOW FIXED. > * An evil wizard cast meddle but the following creatures were not affected: > The exorcist, earth elemental. Is it because they have no reincarnation ? Yes. > Why wouldn't the exorcist reincarnate into a bandit or an orc ? He was set to not reincarnate into anything. I have now changed The Exorcist so that he reincarnates into a good little Halfling. > * A wizard destroyed a white dragon corpse with a magic bolt and the dragon > cried ! It's an old bug you told me was allegedly fixed :-) OOPS! I put the "and !isDead(b) and !isScroll(b)" code on 1 of the lines that needed it but I forgot to put it on the other line that needed it! doh! NOW FIXED. > * The game ended as I killed the last piece of independent earthquake. > However, there was still a bird lord alive belonging to a dead player > (product of impurities). With impurities, you can win the game in an impure manner 8) Creatures that belong to dead players are no threat to you whatsoever so there is no need to kill them. ********************************************************************** End Bug Reports from Frédéric. (Is there ever an end? 8) ********************************************************************** * Score Screen has now been translated into Français. I added in a teensy amount of code for stringwidth sensitivity so that the screen looks good in English and Français. I'll probably have to add more code when the game is translated to other languages. I only added in the bare minimum amount to make the Français score screen look good. * SMALL BUGS: Microscopically small even 8) The following spells would, in exploration mode, reveal the position of the target for a brief instant by drawing a blank image in the target cell. However, this blank image was immediately redrawn properly. Apparently nobody ever noticed this small flaw. It affected the following spells: Armour, Brain Boost, Cloak, Combat, Cursed Sword, Magic Shield, Meteor Storm, Recover Boost, Restoration, Sword of Sassenrath, Scavengerism and Exophagy. NOW FIXED. * ALL appropriate occurrences of DrawCell() have now been replaced with ReDrawCell() I systematically went through the entire program and did this. DONE. * 1st and 2nd Spell Information Panels have now been 100% translated into Français. * Replaced all appropriate occurrences of player_name[x] with PlayerName(x) in the entire program + coded the PlayerName() routine to handle the multilingual translation issues. This took 1 hour. * Sent Frédéric version 2.85 for testing/translating on July 19th, 2000. * Sent JKD version 2.85d for OS 3.5 + MagicMenu + P96 + CyberGraphx testing. He reports that Chaos works perfectly on all systems! ------------------------------------------------------------------------- CODE REDUCTION UPGRADE There are tons of no-longer-used routines in info.c. These were originally used for the old 640x256 information panels. The code was still in the game and active so that I could switch between the old way and the new hires way any time I wanted. However, I never actually did that. And now the old code is seriously out of synch with the new way of doing things so I am finally eliminating it all. Eliminated 1252 lines of code from info.c Info.c 155488 -> 103018 SAVED: 52470 bytes of source code. Chaos 433540 -> 420040 SAVED: 13500 bytes off the release version of the Chaos executable. All the code that I removed has been saved in SC:UnusedInfo.c in case I need to reference it for some strange reason. Which I seriously doubt I ever will. --------------------------------------------------------------------------- * TEST lzx vs lha I archived a complete demo distribution of the game lzx: 4942881 bytes. lha: 5298980 bytes. SAVED: 356099 bytes. * Sent Xav version 2.85 for playtesting on July 20th, 2000. BEGIN: version 2.86 * Replaced EndTurn.8svx with Frédéric's EndTurn.8svx because nobody liked the old end turn sound. I renamed the old EndTurn.8svx to MaxCombat.8svx and changed the game code to play this sound anytime anyone casts a spell that makes a creature have maximum combat. This means the following spells: Combat, Touch of God, Chaos Lord. ------------------------------------------------------------------------- Translation of IP1 (Information Panel 1) Creature Statistics Screen to: Français. * Scavenge translates to Charognardise which is _entirely_ too long. So I'm leaving this in English. Someday when we make the AGA version this can be changed to the "Scavengerism" spell icon, which looks quite nice. Magic Resistance translates to Résistance magique which is too long. Résistance magique -> Résist. magique Ranged Combat translates to Combat ŕ distance which is too long. > Ok, so how should the info panel look? > > Option A: > Combat > Tirer > Combat spécial > > Option B: > Combat > ŕ distance > Combat spécial > > Option C: > Combat > ... ŕ distance > Combat spécial > > Option D: > Combat > Combat de loin > Combat spécial Xav: Option A is the good one. JC: Option A implemented. END Translation of IP1 (Information Panel 1) Creature Statistics Screen to: Français. ------------------------------------------------------------------------- * Reduced the amount of time that the horrible looking circular pattern is displayed on the lissa-box requester things. Reduced it to 1/3 of its old value. * ADDED Multingual talklists code so that now the game can use talklists of any supported language. * The dir structure of certain things in Chaos has now changed. The Screens/ dir and TalkListsDir/ have changed. So any further updates issued need to be COMPLETE updates, not just the executable file. Possibly other things in the dir structure or file structure have changed also. * FLAW: Touch of God and Chaos Lord do not do any sort of graphical effect! So you cannot tell who it is being cast on! NOW FIXED. * Improved CellEffect() with better sound file handling. * PROBLEM: The req.library filerequester is optimized for use on non-interleaved bitmaps. This means the scrolling sucks bigtime on the chaos interleaved bitmaps. It colorflashes horribly. It goes from having the best scrolling of any filerequester to suddenly having the worst scrolling of any filerequester. So I opened up yet another new screen. This one is just like the old HiResScreen only it is noninterleaved. Now the scrolling looks fast and smooth again! NOW FIXED. * LOAD/SAVE screens now have smooth scrolling once again. END of version 2.86 * Copied the entire gamedir over to Chaos_2.9/ so that I may now begin work on the Enhanced Graphics Version on Tuesday, July 25th, 2000. * Fixed Passage description. * July 25, 2000: The size of the release executable file "chaos" is 421048 bytes. ************************************************************************* * BEGIN ENHANCED GRAPHICS VERSION V 2.9 July 25, 2000 * ************************************************************************* I have written a new graphics system that uses standard iff pictures to describe how monsters and magic spells and all other objects in the game look. Each object in the game has its own 320x256 64 color EHB mode iff file. The name of the file is, and must be, the exact name of the object in English. The spaces must be there so don't try to rename them. All the files are already included with the proper name in gfx/Spells/ so you don't need to worry about this. All you have to do is edit any of the files you want and they will automagically get included into the game. Unless for some reason the clock in your Amiga is broken. In which case you may have to type in the shell: delete gfx/dat/#? That will delete the graphics index files and force the game to rebuild them from scratch. It takes a full minute to rebuild all the tiles from scratch because it must open and close 350 files + read in 350 files + decompress 350 files + cut and paste 731 tiles, check for blank frames, etc. These numbers are only accurate as of July 25th, 2000. The numbers will be much larger in the future. If you change any graphic file then the next time you start the game, it will notice that you have changed something and will rebuild the tile indexes. This will take a full minute or more. Selecting "New Game" from the menu is currently not sufficient to reload the tiles. You must completely quit the game (exit to DOS or WorkBench). Then reload the game and all will be well. 8) The old 3 frame animation limitation has been ERADICATED. You may now draw or render as many frames as you like. The old 32-color limitation has been ERADICATED. I couldn't think of any conceivable reason why any strategy game should be limited to 32 colors. All Amigas support 64 colors or more so we are going to use them. Ye Olde Rules for GrafixMages: ============================== 0. The first 31 pixels at the top of the screen are ignored. 1. All Living Creatures _MUST_ have a dead image! (Even if you just cut & paste in an image of a dead orc.) The leftmost tile is reserved for the dead image and only the dead image. 2. All Inanimate Objects and Growths and Undeads must _NOT_ have a dead image. Its dead image space should be blank. 3. You may have as many frames of animation as you like. Ping-Pong and continuous looping playback are both currently supported. 4. In order to specify that you want your animation played in looping mode you must change the purple line at line 32 to be color #1. This tells the game to play this animation in a continuous loop. 5. The animation frames are terminated by the first completely blank frame. 6. The image must use the supplied palette. If you rearrange the palette for artistic reasons then you _MUST_ rearrange it back to its original state before saving the file. Failure to do this will result in wrong-looking graphics. 7. If you want to leave extra grafix on the screen that you are working on then that's ok. They will be ignored. Only the tiles up to the first blank tile are processed by the game. Any extra gfx at the bottom of the screen are ignored. ---------------------------------------------------------------------------- * BUG: When playing in exploration mode, if you try to examine an unexplored cell and the cell has a scroll in it then it lets you read the scroll! NOW FIXED. * BUG: Joseph Conwell reports that he cast Sword of Sassenrath on his Orc and then when it promoted to Mighty Orc it lost its Sword of Sassenrath. JC: This is because it promotes to whichever stat is bigger. 0 > -1 so it makes sense. However I have now hacked in some extra code so that if you posess negative special combat then it will be promoted to whichever stat has the greatest absolute value. NOW FIXED. 1. Write and test code to read in all the tiles from IFF files. DONE. 2. Load new color palette. DONE. 3. Rewrite ColorCycler. DONE. 4. Redefine all #defined colors to new values. DONE. 5. Rewrite ReDrawCell() to use the new multiframe-capable form. DONE. 6. Totally rewrite the animator task to handle the new tiledata + keep track of the multiple framecount stuff and which direction it is going through the animation in. Animator tasks needs the following variables: 1. WORD FrameCount so it knows what frame it is on. 2. WORD AnimationDirection. 1=Forwards, -1=Backwards. (for ping pong playback) 0=stopped. 3. BYTE PlayBackType 0=PingPong. 1=ContinuousLoop. ALL DONE. 7. Rewrite sm.c to handle new variables: sm.c FrameCount will ALWAYS be set to 1 sm.c AnimationDirection will ALWAYS be set to 1. ALL DONE. 8. Edited Meteor Storm spell to work with new system. DONE. 9. Rewrite the entire game to use the new system. DONE. 10. Eliminate all old references to the old hardcoded cimage1[], cimage2[] and cimage3[] arrays which limited the game to 3 frames of animation. DONE. 11. Eliminate all old references to DeadImages[] array. DONE. 12. Added the code to support loading files with CONTINUOUSLOOPing anims. Just change the color of the first line to #1 and the anim will play in looping mode. DONE. 13. Hack in code to write out all those hardcoded cell effects gfx and color convert them to the new palette and store them as IFFs in the gfx/CellEffects/ dir. DONE. 14. Write code to read in the IFF CellEffects. DONE. 15. Rewrite CellEffect() to use the new IFF gfx. DONE. 16. Rewrite BoardEffect() to use the new IFF gfx. DONE. 17. Remove all hardcoded explosions and magical effects graphics. DONE. 18. Don't load the old graphics file "chaos.dat" anymore. DONE. 19. REMOVE all graphics handling from sm.c. DONE. 20. Edit all 349 spell files and remove all spell-descriptions and imagery. Remove all Description: info and Imagery: info and Image: info. DONE. 21. Edit sm.c to remove all code related to reading/processing/including image files into the compilation process. DONE. 22. Edit sm.c to remove all code related to reading/processing/including spell descriptions into the compliation process. Comment out or delete everything to do with spell descriptions. DONE. 23. There are several programs that are being compiled by the makefile in order to make the old compressed spell descriptions file "pool.ssc" Eliminate them. DONE. Now that I've eliminated all that stuff from the makefile (spell descriptions, text compression encoding & decoding routines) + all that stuff from the spell manager (description processing and image processing) a smake clean smake developer version now takes only 11.5 minutes on my 25 Mhz 030 (freshly booted, not on the internet) 24. Convert all the levels to the new animation system. A. Load each old level. B. Go through the entire visible board and underboard C. If FrameCount==0 then FrameCount=1; D. Stuff 1 into the AnimationDirection All levels have now been converted to the new animation system! DONE. 25. Edit io.c to handle loading a game that was using one set of graphics files into a system that is using completely different graphics files. Check for any currently illegal settings and adjust them. DONE. 26. Add in gfx/Spells/ and gfx/dat/ and gfx/CellEffects to MakeDemoOfChaos.txt DONE. 27. GRAPHICS: Put in Xav's new moon from setupscreen as Sanctuary. DONE. Put in Kreton's Wizard graphic as Wizard 1. DONE. Edit Generator. DONE. Remove blood from ShapeChanger. DONE. Spriggan is messed up. Fix him. DONE. Mess with Witches as new wizards. Leave this for Xav. Amphisbaena is all messed up. Leave this for Joe or Xav. 28. Edit SpellManager script file to remove everything to do with spell descriptions and images. DONE. 29. Add in code to load the setupscreen1 from gfx/Screens/English/SetupScreen1.iff DONE. 30. Rewrite the setup code to have everything on SetupScreen1 positioned correctly. This took some time because the name gadgets were overwriting the border. DONE. 31. Add in code to load the setupscreen2 from gfx/Screens/English/SetupScreen2.iff DONE. 32. WOOPS! I forgot to rewrite PutToSleep() to stop animating creatures that are asleep! There is a sleeping Pegasus that is still flapping its wings like crazy! NOW FIXED. 33. Rewrite Flesh to Stone and Mass Petrification to properly stop the newly created inanimate object from being animated. DONE. 34. Rewrite Stone to Flesh and Inanimorphobiosis to properly reactivate the animation on a previously-animated creature. DONE. 35. Put Xavier in the scrolling credits and the docs. DONE. 36. FLAW: The pentagrams on the "About" screen are now invisible due to the new color palette! NOW FIXED. 37. Add in code to load the EndTurn, Question Mark, Dismount, Load and Save gadgets from gfx/Gadgets/English/ How to test a lzx archive: lzx t archive.lzx >T:test.txt After converting all the gfx to IFF files, the following spells looked horrible and I spent some time editing them. Abath: I antialiased him and redrew his horn so now it looks really good. Abduction Converted horribly so I edited it some. Achiyalabopa: I added texture + antialiased it. Acid Rain: Antialiased it. Beveled it. Aerial Servant: I added texture + antialiased it. Aesculapius: Skipped. I think Xav has already redrawn it + Aes drew one in 64x64 that needs to be shrunk down and used for this creature. Put in Xav's new "Snake" Aesculapius + drew a dead image for it. Agathion: Antialiased it. Air Elemental: Antialiased it. Alliance: Antialiased it. Alter Reality: I attempted to shade it with shadows. Limited success. Alternography: antialiased it. Amphisbaena: Antialiased it. Animate: Included Xav's stupendously wonderful looking Animate! Apple Wood: Added some texture. Antialiased it. Arborist: Antialiased it. Archery: Antialiased it. Arctic Wolf: I got rid of the hard black background + antialiased it. Then I changed the colors to be whitish like an Arctic Wolf should really look. The old wolf I saved as "Dark Wolf" for future use. Armour: Antialiased it. Replaced it with Xav's gray-scale Armour. Aviary: I hated how the old one looked so Joe and I completely remade it. Azer: Antialiased it. Included Joseph's improved Abath, Arborist, Alliance, Agathion, Azer, Apple Wood, Aviary. I totally redid Joe's Aviary and Apple Wood and Archerotomy. Included Xav's improved: Agathion, Air Elemental, Acid Rain. I made a new variation of the baboon called baboon2. I may use this in the future somehow. Baboon: Antialiased it. Banderlog: Antialiased it. Bandit: Antialiased it. Basalt Golem: Antialiased it. Basilisk: I gave the basilisk a purple eyeball + Antialiased it. Battle Cry: It converted badly so I fixed it. Then I anti-aliased the flag also. Bat: Antialiased it. Bat: I went back and totally redrew it and made a new dead body. The only problem now is that it is not animated :( Included Xav's new well-drawn and animated Bat! Betrayal: converted horrbily so I had to fix it. Then I added shadowing to it. Biohazard: Beveled it. Bipedal Generator: I always hated the way the Bipedal Generator looked so I anti-aliased it, recolored it and beveled it. Bird Lord: I antialiased it. Then I went back and antialiased the antialiasing so its SUPER smooth looking. Blue Dragon: Double antialised it. Its super smooth now! Bodak: Antialiased it. Boil: Antialiased it. It looks a LOT nicer now! Redid it using Xav's new Flood graphic. Bolter Wall: I made it rotate. Brain Drain and Brain Boost converted badly so I fixed them then I anti-aliased them. Now they look really nice! (compared to how they used to look) Brain Drain Beam converted horribly so I edited it and fixed it up and antialiased it. Bury: Antialiased it. Threw it away because it sucked. Pirated the bloody corpse from Xav's Scavengerism and the arrow from Xav's Animate and then drew some grass and a pile of dirt. It looks 10x better than the old one. Burstroem's Browser: Included Xav's book. Added more antialiasing to the bottom of the book. Included Joseph's new Bandit and Baboon. They are both MUCH better than the originals! Included Joseph's new Battle Cry and Biohazard. Battle Cry REALLY needs 32x32 pixels and 256 colors! Included Xav's Fantabulous Battle Cry! Included Xav's new Biohazard. I will use Joseph's Biohazard as something else. Included Joseph's new Bipedal Generator and Bodak. Edited Joseph's new Basalt Golem into an animation and included it. Camel: Double Antialiased it and made the hump bigger too. 16x16 pixels is such an absurdly low resolution that it is many times not possible to do proper anti-aliasing :( Cartography: Antialiased it. Included Joe's new Cartography. Cat Lord: Antialiased it. Included Joe's new Cat Lord. Centaur: Antialiased it. The tail looks much better, its fluffier. Chaos Lord: Antialiased. Included Joe's new Chaos Lord. Chronomancer: Antialiased it. Replaced it with Xav's Chronomancer from his setupscreen. Drew a dead body for it. Clay Golem: Made a dead body for it. Cloak: antialiased it. Included Joe's new cloak. It could be better. Combat: Included Joe's new Combat. Combat Drain Beam: Included Joe's new Combat Drain Beam. Command: Didn't translate so well so I fixed it. Later on I replaced it with Xav's fantastic new version! Confidence: I included Joe's new Confidence. Convert: Changed the "M" to a "C" and antialised the whole thing. Crimson Death: Antialiased it. Crocodile: Antialiased it. Included Joe's slightly improved Crocodile with texture on his back + it now has feet. Cursed Sword: Antialiased it and made the hilt a bit smaller. Dalek: Antialiased it. Included Joe's improved version + double antialiased it. Dao: Antialiased it. Dark Citadel: Antialiased it. Dark Wood: Antialiased it. Replaced it with Xav's new bleeding version. Dead Revenge: Antialiased it. Included Joe's improved version. Demon: Antialiased it. Depth: It was already partly antialiased! Oh well, I antialised it all the way and now it looks sort of fuzzy but there is NO blockiness at all. Derro: Antialiased it. Destroy Wall: The converted version looks BETTER than the original! No changes made. Dire Wolf: Antialiased it. It really looks better. Discard: Antialiased it. Disection: Antialiased it. Disrupt: Antialiased it. Dragon Nest: Antialised it but it didn't work out very well. :( Drain: Antialiased it. Dread Elf: Antialiased it. Drelb: Antialiased it. Dual Earthbind: Antialiased it. Eagle: Antialiased it. Earth Elemental: Included Joseph's new version. Eidetic Xenogenicide: Joseph totally redesigned it. It looks much better. Elephant: Antialised it. Sent Xavier Elf Boots + Harpy because I don't know how to make these look better. Elm: I 100% Antialiased it. Emerald Dragon: I 100% antialiased it. It looks really nice now. Encumberance Beam: I included Joseph's new version. Exorcise: I simply replaced the old Exorcise graphic which wasn't so bad with a new one designed by Aes which is TOTALLY AWESOME! It has great shading in it!!! Oops its 2 pixels to tall and 2 pixels too wide! NOW FIXED! Falcon: Antialiased it. Faun: Antialiased it. Fir: Antialiased it. Fire: Antialiased it. Fire Bat: Antialiased it. Joseph made a new "Bat Out of Hell" graphic (It might not be 100% finished yet) Fire Demon: I antialiased it and made the color texture a bit better. Fire Elemental: I antialiased it and changed some pixels around to add some extra color. Fire Shield: Antialiased it a tiny bit. Fireball: Antialised it. Replaced all green with Purple. Replaced all Gray with Orange. Splattered some more orange around in the red. Flesh to Stone: Antialiased it. Replaced all Green with light gray. The rock had many transparent black holes in it! I Replaced some of these with dark gray and others with hard black (nontransparent). I also added some shading to the "+" which looks very nice. Floating Eye: Antialiased it and cleaned it up some. It looks better now. Flood: Antialiased it and threw some extra colors arond randomly in 1 of the frames. Flood Shield: Antialiased it and then added beveled edges and more color. Fly: Antialiased it. Free All: Antialiased it. Changed the color of the 2nd key to be compatible with antialiasing. Generator: Antialiased it. Ghast: Double Antialiased it. Ghost: Double Antialiased it + added sparkle to the white and blue dots. Ghoul: Antialiased it and added sparkle to the dots. Giant Beetle: Antialiased it. Used a beetle clipart as a template to redraw it. NOW IT LOOKS AWESOME! Giant Rat: I antialiased it and it now looks WAY THE HELL better!!! Giant Spider: Antialiased it but the colors were so dark to start with that you can't really see any difference. Goblin + Goblin Bomb: Antialiased. Golden Dragon: Antialiased. It looks much better now. This creature already had halfway good shading to it. Gooey Blob: I single antialiased it and it looked good. But there are so many shades of the same green in the palette I decided to go ahead and double antialias it. It now looks very fuzzy. I'm not sure if this is better than single antialiasing or not. It does look smoother and less pixelated but its very fuzzy. Its probably better to have it look fuzzy so I'm leaving it like this. Gorilla: Antialiased it. Gravity Sphere: It looks horrible and I didn't bother trying to fix it in any way. Gray Elf: Antialiased it. Green Dragon: I antialiased it. Then I tried adding some shadowing and texture and it came out quite nice! Its nowhere near Xav-Quality but its a lot better than it was originally. Green Oozey Crap: I screwed around with it and stuff... It looks better than it did. Grizzly Bear: AntiAliased it and added some shading to the dead image. Gryphon: Antialiased it. Halfling: Antialiased him. Made his dead image be decapitated with his own sword. Harpy: I antialiased it. Ack! Its drawn on a hard foreground black! NOW FIXED. A few days later I went back and partly double antialiased it and added some simple shading to it. Haste: Antialiased it. I tried to add a drop shadow to the + but it looked terrible. Haunt: I antialiased him then I animated him! This is my first attempt at animation. Hidden Horror: This is supposed to look identical to a halfling so I just copied the Halfling as this. Higher Devil: I only made extremely minor touchups on this. Hippocrates: Antialiased him. Moved him to the edge to make room for my new improvements. Added a Caduceus and a Red Cross so that it is obvious that he heals. Removed the Dead Orc Image and made him a real Dead Image. Horror: Antialiased it and added some simplistic shading. Horse: Antialiased it. Hybsil: Antialiased it. Hydra: Antialiased it. Added shading. Hyperclone: Made simple modifications. Ice Breath: Tried to antialias it some. Imp: Antialiased it and added some nice shading! Redrew the Dead Image. Inanimage and Inanimatologist look identical to a Wizard 1! I propose: Xav's Wizard 1 becomes Inanimage. Xav's Wizard 1 minus the wand becomes Inanimatologist. There will be a completely new wizard for Wizard 1. (I'll decide which graphic later on) This means the old Inanimage/Inanimatologist/Wizard 1 will be used for absolutely nothing! But I can assign him to be something later. I can also draw sparkles around the end of the wand. Inanimorphobiosis: I couldn't really do anything to this because it just plain needs a much better rock. Invert: I messed around with it some... Didn't really improve it. Jaguar: Antialiased it. Jann: Antialiased it. The dead image was the same as the Dead Orc so I redrew it. Joker: I added shading to it and made it look 8x better than before!! Juju Zombie: Antialiased it. Justice: Change the shading on part of his face. Kill: Added Beveling with only limited success. King Cobra: Antialiased it and added a bit of shading. Leopard: Antialiased it and changed the green spots into golden spots. Lesser Devil: Antialiased it. Level: Beveled it and shadowed it. Lich: Antialiased it and gave it yellow eyes. Lich Lord: Antialiased it and gave it yellow eyes and modified the crown. Lightning: Beveled it. Magic Bow: Antialiased it and made the curve of the bow extremely smooth. Magic Castle: The original was so so hopeless looking that I didn't bother trying to smooth it out. I just replaced it with Xav's "Dark Castle". The Dark Castle has a flaw: The Door and windows are made of the transparent black instead of the hard foreground black. NOW FIXED. Magic Knife: I replaced the old one with Xav's new one. Magic Shield: I simply replaced the old one with the one that Aes drew for me many months ago. However this shield looked like a normal shield. But this shield ONLY increases your magic resistance so I added some color-cycling to it so that people would remember that it is a _magic_ shield not a real shield. Magic Sword: I replaced the old one with Xav's new one. Magic Wand: I never liked the old one so I drew a completely new one. Magic Wood: I completely redrew the trunk so its 10x better. I haven't decided what to do about the treetop though? Should it be a normal treetop but with some color cycling added to indicate its a magic tree? Or what? Manticore: I antialiased it then I drew a shadow under the wing. The shadow looks nice. Marid: Antialiased it and added the stripe to the dead image. Mass Morph: I just took Xav's Animate spell and switched it around. Memory Master: Antialiased him and made a completely new dead body with blood splats and decapitated head. Memory Mage: (Originally looked identical to Memory Master). I took my new Memory Master graphic and gave him a Magic Wand + shaded his costume according to the light shining on him from the magic wand. Mind Flayer: Antialiased it. Added a bit of shading. Mount: Antialiased it. Added a bit of shading. Move it: Antialiased it, beveled it and made the whole the green for "go" Mud Man: Antialiased it. Totally redid the color + added a bit of shading. Totally redid the dead image. Neo-Otyugh: Antialiased it and darkened the back leg. Nightmare: Antialiased it and darkened the back legs. No Grow: Antialiased it and added texture. No Mount: Antialiased it and made the tail better. Nuke: Redrew it. Antialiased it. Ogre: Antialiased it, shaded it, made the arm have a shadow, improved the head. Ogre Mage: The Ogre Mage looked identical to the Ogre so I just kept it that way for now. Ogre Warrior: The original Ogre Warrior was just a mirror image of the Ogre so that is how I did the new one. I just mirrored the Ogre and saved it. This means the shadowing is actually backwards. But oh well... we can worry about that later. Maybe it will be funny to have a backwards shadow on him? Ogre Assasin: He's just like the Ogre Warrior but with a differnet animation sequence. He has the backwards shadow as above. Oracle: Designed by Xav. I brightened the crystal ball a bit and made it look like the Oracle's fingers were touching the crystal ball. For the dead image I drew a crystal ball laying on the ground + pirated the dead image from Scavengerism. Orange Jelly: Antialiased it. This graphic needs professional attention. Orc: Antialiased it. Changed his face. Orcs: same as Orc. Paradigm Shift: Antialiased it. Passage: Antialiased it. Beveled it. Pegasus: Antialiased it. Pit: Recolored it and antialiased it. Probably use a Xav graphic for Plasma Beam. Platinum Dragon: Antialiased it. Double Antialiased parts of it to make it really smooth. Points: Antialiased it. Beveled it. Poison Dagger: Antialiased it. Drew blood on it. Drew blood dripping from it. It now looks really cool. Pool: Antialiased it. Power Wall: Antialiased it. Pox Shield: Antialased it. Protection: NEEDS TO BE REDRAWN! Pseudodragon: Antialiased it. Added a bit of shadow under the wing. Double antialiased parts. Pyrohydra: Its identical to the Hydra. Pyrotechnics: Antialiased it. Beveled it. Python: Antialiased it. Quench: Antialiased it + smoothed the fire a bit. QuickShot: Antialiased it and beveled it and changed the color to use the color cycling color and some brown. Radioactive Land: It was just a bunch of green dots, it could have been grass! I changed the green dots to purple dots so now it really looks radioactive. Raise Dead: Pirated some of Xav's gfx and rearranged them and edited them into a nice Raise Dead graphic. Range Boost: Antialiased it and beveled it. Red Dragon: Double antialiased him. Reflector: The colors did not convert well so I recolored it and double-beveled it. Replicate: I tried to antialias it but it came out looking HORRIBLE so I left it alone. Repulsion: Double beveled it and added many more shades of color. Roper: Antialiased it + shaded it. Separation: Took the alliance spell and drew a big X over it. Shadow Dragon: Antialiased the arms. Put a 3,1,0 brown dot at the end of the tail and foot. ShapeChanger: Joseph should do some kewl morphing with this!! Skeleton: Antialiased it. Slow: Beveled it. Solar: Antialiased it. Spectator: Made it perfectly round. Antialiased it. I could easily make an awesome animation out of this one! ***************** Spectre: Antialiased it. Speed: Beveled it. Spriggan: Antialiased it. Still: Antialiased it. Stone Giant: Antialiasd it. Stone Golem: Made a better dead body. Stone to Flesh: Pirated some Xav gfx to make this one. Strong Wall: Darkened it. Subversion: Beveled it. Summons: Beveled it. Swap: Changed the colors a bit + beveled it. T-Rex: Antialiased him. Double antialiased his back. Teleport: Remade it using Xav's little man graphic. Tempest: Antialiased it. The Exorcist: I went crazy and totally redrew him with magical crosses that are animated with magical glowing + he turns his head. I also made a dead image of him in a pool of blood with his cross stuck threw his body! Its totally cool! His legs could be better though, but I don't know how? Thundermare: Simple antialiased him + added blood on the dead body. Torment: Beveled it. Troll: Simple antialiasing + some blood. Ubiquiscope: Beveled it. Unicorn: simple antialiasing. Changed the horn to white. Vampire: Antialiased it. Shaded it. Vodka: Find Kreton's Vodka!!!! Volcano: Antialiased it a bit. Vortex: Antialiased it a bit. Vulture: Antialiased it. Shaded it some. Does this look ok? Wasp Nest: Antialiased it. The curves are ultra smooth now. White Dragon: Antialiased it. Added shadowing under the wings. Wight: Antialiased it. Wolverine: Antialiased it. Tried to put some blood on the dead body. Wood Elf: antialiased it. Joseph improved it some. Then I drew an arrow stuck in his head for the dead body. hehe. Wraith: Antialiased it. X-Ray: Beveled it. Replaced the whole thing with Joseph's new color cycling X-ray. Zombie: Antialiased it. Tried to shade it some. All spells A-Z are done!!!!! (EXCEPT FOR W!!!) All W is done except for Wizards! Went through Joe's L-Z. Added in Joseph's new: spectator, spriggan, speed, storm, sleep, skeleton, Hyperclone, Shocker. Shape Changer, Shadow, Magic Attack, Lich Lord, Leopard Put in Joseph's new: Joker, Justice (goatee), Iridium Horse (back leg), King Cobra (hood, now brown), Imp (more frames of animation), Hippocrates (now has a 2 pixel hat), Free All (now has 3 keys instead of only 2), Dark Power (multi-shaded green), Aerial Servant (many frames of animation + different colors) Eye for an Eye: Needs to be totally redone! Animate Sux! Exophagy doesn't even have a graphic! Sent Eye for an Eye, Animate, Exophagy to Xav along with spell descriptions: They came back looking unbelievably awesome!!!!! I removed the green from the side of the Tree in Animate. Xav's Telescope: I lightened the moon. Included Xav's Magic Bolt, Magic Glass, Mana Battery. Included Xav's amazingly great new: Shadow Wood, Dark Wood, Fir Tree, Magic Wood, Apple Wood. Included Xav's amazingly great new: Violet Fungi, Gooey Blob, Green Ooze, Orange Jelly, Fire, Flood, Earthquake. --------------------------------------------------------------------- * August 2, 2000: The size of the release executable file "chaos" is 325816 bytes. On July 25 it was 421048. SAVED 95232 bytes! * Sent v2.9 to Xav on August 2, 2000 so he can design gfx for it over his 2 weeks vacation. * Put in Xav's fixed Wizard 2, Wizard 3 and Fly. We still need 4 female wizards. * Xav says to change the French spell desccription of Dark Citadel from Citadčle to Citadelle. DONE. * August 5, 2000: TileCount=824. There are 824 tiles in the game. * BUG: Mana Battery Scrolls give bonus spells just like a real Mana Battery. NOW FIXED. * BUG: 1 occurrence of "Brain Dead" was not using translated strings thus it was always appearing in English. * Sprained my brain. No work done for 10 days. * August 15, 2000: Replaced all occurrences of "Run JCsound >NIL:" with "Run <>NIL: JCsound <>NIL:" ******************************************************************** Xav Returns from Vacation! Lots of new Tiles! ******************************************************************** Included Xav's new gfx: Ball Lightning, Basalt Golem, Bless, Charm, Clay Golem, Coercion, Cure, Dalek, Dao, Dark Wood, Death Bringer, Demonic Touch, Depth, Destroy Wall, Discard, Double, Elephant, Fireball, Freeze, Haste, Horse, Hyperclone, Irvine's Invulnerability, Justice, Lightning, Lion, Magic Bow, Meteor Storm, Moveit, Mullac de Irvine, Protection, Pyotechnics, Quickshot (quickshot is hard to read but I went ahead and included it anyway). Radioactive Land, Recover Boost, Reflector, Replicate, Request, Reveal, Restoration (I didn't like the one with the dithered heart, it needs more shades of color or higher resolution so I used the nondithered version.) Seismology, Shocker, Simulacrum, Sleep, Solar, Standard Wall, Stone Giant, Stone Golem, Storm, Strong Wall, Touch of God, Triple, Turns (I redid the 0). Uncertainty, Unicorn, Vodka, Volcano, Wake, Weak Wall, Wight, Wizard 1, Wizard 1, Wizard 6, Wizard 7, Wizard 8, Wizard Wings, Wraith, Zombie. The following gfx were identical to the gfx already in my version of the game: Fly, Wizard 2, Wizard 3. ******************************************************************** END: Xav Returns from Vacation! Lots of new Tiles! ******************************************************************** August 18, 2000: * Included Frédéric's new Français Spell Descriptions: Water Elemental, Sluggishness Beam and Combat Drain Beam. Frédéric bug report: * Something strange happened when I cast consecrate on a higher devil sitting on the bottom border of the screen: the devil himself was not killed, of course, but the spell did extra sound effects, as if there had been creatures below. And I heard an allelujah sound, and at the end of the turn the bonus window opened. No victim, no "Other", but I had the choice of 1 spell among 31 !!! The trouble was that the Drainer() function had NO error checking! Ack! all these years its been affecting cells that don't exist! NOW FIXED. * Sent all English and Français spell descriptions to Red|Blue in Quebec for proofreading. He liked the game "Romance of the 3 Kingdoms" and "Bandit Kings of Ancient China" so I figure he'll like Chaos. >>> * Due to impurities, a generator went asleep but continued to generate >>> sleeping creatures. It's kind of strange don't you think ? Impurities >>> shouldn't put generators to sleep ! They should only change their >>> allegeance to a wizard or the independents (the sleeping creatures >>> generated are often destroyed as soon as they are generated :-) ) >> This sounds sooooooooooo hilarious!!!! I don't know how you find all >> this weird stuff out!!!! hehehehhahahahahahah 8) >> It sounds so funny I'm not going to change it. I've never seen it >> happen before! And if it does happen it must be very rare. > >> I probably should fix it so that it doesn't change to dead wizards... >> either that or let creatures move, even if they belong to a dead >> wizard. > > That would be a good enhancement. And change the dead revenge so that dead > players keep control of the generated creatures. * NEW FEATURE: I have now adjusted the code, such that if a creature exists who belongs to a dead wizard, the creature will still be moved as usual. * DEAD REVENGE IMPROVED: I have now adjusted the code such that a wizard who is killed while posessing the Dead Revenge powerup will not lose ANY of his generators! The wizard will die, but his generators will live on! And any creatures produced by the generators will be controllable by the player! I forsee this as being strategically important primarily in multiplayer games where a certain wizard may be killed first, but can still have some influence in the game due to his generated creatures. For years I haven't even bothered casting Dead Revenge because it just didn't really seem to benefit me; there were always better spells to cast. Now however, I will always try to cast Dead Revenge! * EDITED Dead Revenge spell description. On 18-Aug-00, Frédéric Delacroix wrote: > I have found a strange bug in the game related to the chaos lord and fire. > It could be the fire shield (and possibly other shields) that's not working. > Here are my notes. > * BUG ! My wizard (an undead chaos lord, by the way, with shocker) was > covered by its own fire breathed by one of my 3 platinum dragons, but it did > not die !!! I destroyed the fire with another platinum dragon breath, and I > could see a very very strange animation, alternating: my wizard (wizard 1), > a grey elf (previouly dead) and the dead grey elf. I guess this is because > the fire had 3 animation frames... ? When I query the stats, everything is > back to normal chaos lord stats, except for life force who's back to 19. > > * No wait ! There's another big strange difference ! It's Wizard 1 belonging > to nobody ! And it moved and attacked (but only shot once instead of three) > with the independents ! He killed my cats ! What a strange creature ! I kept > the autosave (083) > * Actually it moves between me and my cats (I have the cat lord), not with > the independents. JC: ok, I have investigated this and it all comes down to this: * BUG: Fire Shield and Flood Shield DO NOT WORK! Ack! All these years Fire Shield and Flood Shield have not been working! NOW FIXED. Included Frédéric's new English and Français spell descriptions for Power Walls and Webs. -------------------------------------------------------------------------- New tiles from Xav: Copied XMAN.IFF to UnusedGfx/Xman2.iff Copied QUERY.IFF to UnusedGfx/ Included the new Camel, Fire Bat, Mnemicide, Nuke, Singular Earthbind and Zombie gfx. Ogre: I haven't decided what to do about the Ogre yet. Maybe I'll use him as the Ogre Warrior? He looks good, but he's not animated + I really REALLY like the shadow on the current Ogre. I'll probably make him the new Ogre Warrior. Orc: The orc looks great! But the problem is that an orc is very wimpy in this game and he should not be so big. He should be small and wimpy looking. He can look good, so long as he is smaller to reflect his weakness compared to other creatures. Do you think you could make a small creature to be the orc? ------------------------------------------------------------------------- I went through Joseph's new gfx. Included Joseph's new Mutate, Platinum Dragon, Pool, Recognomancer, Roper, Tempest, Wizard 3 (just changed the black eyes to brown), Wizard 8. The new Halfling looks good, but his helmet makes him look bigger. We really need the Halfling and Imp and Orc to be small creatures. * FLAW: When a Tempest kills something, it doesn't make the dying noise and it doesn't print any text message either. It just sort of disappears. NOW FIXED. On 22-Aug-00, Frédéric Delacroix wrote: --------- > * Garbage appears in the french translation when I have reveal in my spell > list and the mouse pointer is over it. I get something like > "RévélerÜF\ŤJ­I@". I looked at the "Reveal" description file but it seems ok > to me... ? This only happens with this spell. JC: It is the very last spell. The very last spell wasn't being NULL-terminated. NOW FIXED. > * When a creature has a negative combat statistic, it can heal other > creatures. But the "m" key does not show it can move over friendly creatures > to heal them. NOW FIXED. ------------------------------------------------------------------------- * BUG: If you shoot and kill your own wizard, when you end your turn, sometimes various random enforcer hits happen and always various random bits of memory get corrupted. This was caused by MoveWizard() being performed on a dead wizard so it thinks the wiz is in cell -1 which causes many illegal mem accesses. NOW FIXED. August 28th, 2000: The electricity was out from around 2:00 a.m. to about 7:40 a.m. There was no light! I couldn't see anything! It was like living in the dark ages! I couldn't get on the internet! And I couldn't play Chaos! I almost died! * Included Xav's new Singular Earthbind, Dual Earthbind, Dragon Nest and Goblin / Goblin Bomb graphics. * BUG: The archery effect randomly locks up the entire computer (sometimes). Using logfile code I was able to narrow it down to the following piece of code: DO_WHILE (px != tx) register double y = (double)(mx - px); AUDIONote (i--); MaskWritePixel (rastPort, px, (WORD)py - h + (WORD)(d * y * y)); px += e; py += dy; LOOP I was unable to narrow it down any further. I inserted more logfile code to prove for a fact exactly which line was causing the machine lockup but then the bug refused to happen. AUDIONote() and MaskWritePixel() are used countless times throughout the game and have proven themselves to be 100% reliable. So what could the problem be? What is different about this use of those routines and any other? ANSWER: The animator task is STILL RUNNING during the archery effect! During all other effects there is an ObtainSemaphore(&BoardLock); which prevents the animator task from running! The archery effect would actually look better if it had an Obtain/Release Semaphore pair in it. Ok, but the main program and the animator don't share any variables that are changed anywhere EXCEPT for 1 thing: The animator task contains the following code: AnimatorrastPortLayer=rastPort->Layer; // Disable clipping while we have a lock on the board. rastPort->Layer=0; // No OS clipping = more SPEED. MaskWritePixel(rastPort,x,y) is using rastPort just like the animator is using. This is as it should be. So I theorize that sometimes task switching kicks in right in the middle of a OS WritePixel() call such that WritePixel() starts out using rastPort with a layer and ends up using a rastPort without a layer (or vice versa). And this somehow makes the OS go insane and crash. So how should I fix this? A) Add an ObtainSemaphore() ReleaseSemaphore() pair to the archery code? B) Comment out that layers disabling code in the animator task? I am choosing option B for the following reasons: 1. I don't ever want this bug to happen again! Someday someone might code a new routine that does writes or reads from rastPort without getting a lock on &Board first! Then the bug will be back! 2. I don't have time to fiddle around chasing silly bugs like this so we'll just have to settle for an animator task that is now 10% to 15% slower. 3. Now that I've implemented the fix, THAT MYSTERIOUS BLUE LINE THAT KEPT RANDOMLY APPEARING ON THE LEFT HAND SIDE OF THE BOARD IS GONE FOREVER! NOW FIXED! * BUG: Strange blue line randomly appears on the left side of the board. NOW FIXED (see above). * PROBLEM: Using default settings the music is playing during the bonus spell selection panel. This causes JCsound to fail. This doesn't hurt anything but it is disconcerting to the user to see messages in the cli window that say "ChaosDigitalSoundSubProcess failed returncode 150" so I have now changed the bonus spell panel to not attempt to play any sound effects if the music is playing. NOW FIXED. * Included Xav's Abduction graphic (the one with the flying saucer). The only trouble is that the Abduction spell doesn't really abduct anyone. Abduction should really be renamed as BrainWashing or something. "Abduction" should be the same as Vanish but I can't think up a way to make it be different from Vanish. (?) September 3, 2000: * Included Joseph's new Eagle (2 extra frames), Skeleton (Added a few new frames), Dragon Nest (He thought it looked to much like a friendly little fireplace so he made it round. It is now an interdimensional "portal"), Pegasus (1 extra frame), Crocodile (fixed the feet). * FLAW: A Range Boosted or Aesculapiused Goblin loses some ability when killing an Archer and picking up the bow. NOW FIXED. September 11th, 2000: * Included Xav's new Français setup screen I and II into the game. * Sent v2.9d + A500 + Trumpcard 500 with 200 meg HD and 4 megs ram to Vivian in exchange for a SCSI CD-ROM drive and 2 Amiga Active Magazines. * FLAW: If a person doesn't have narrator.device installed then the game won't play. I have now removed all narrator.device dependencies so this is NOW FIXED. * ADDED a new code module prefs.c to Load and Save user preferences in a plain ASCII file. I just hacked and slashed sm.c into prefs.c. This ended up still being a lot of work. Over 1200 lines of code. September 14th, 2000: * New menu option: "Save Prefs" * Changed Français info panel Tirer -> Tir. Frédéric writes: * "If you want to read about a spell, point at it and press "q" for Query." I let it as is, but there's something you should be aware of: in the french keymap, I must press "a" instead of "q" to get info. But this can change also for other french-speaking countries. What you should do is use the keymap.library (in ROM) to revert the wanted character into a wanted keypress, so that the letter can be correct in all keymap configurations. JC: Ok I did this and tested it and it works. NOW FIXED. * PROBLEM: Now that we have improved pearl.font for Chaos there can be a problem. If a person already has the old pearl.font installed and is using it in his workbench or CED or whatever, then it will already be loaded. Thus when Chaos attempts to load "pearl.font" it will load their old unimproved version since it is already in memory. Therefore I have now renamed pearl.font -> ChaosPearl.font and ran fixfonts on it. NOW FIXED. * Made documentation directories. Copied the quickstarts into them. * Added #?.prefs and Documention/ all to MakeDemoOfChaos.txt * BUG: Justice randomly does the following: A: Doesn't work. B: Works C: Works but then awards a bonus spell on a creature that isn't supposed to give a bonus spell. IF (cell<0 or cell>=GAMESPACE) return cellp=&board[cell]; cMR = cellp->char_stat.MR - MD; The above code sequence looks innocent enough. But in fact is the work of EVIL. It was causing all the random errors of Justice, Dark Power, Vengeance, Exorcise etc. There is a ; missing from the end of the first line therefore the 2nd line was never being executed. NOW FIXED. ************************************************************************ IFF Gadgets ************************************************************************ The IFF gadget loading code: Each gadget will be an IFF brush. I must load each of these brushes into an image struct. 1. Open the IFF-file. 2. Determine its x and y size. 3. Allocate the memory for that 4. Read it in and set up the struct Image for it. 5. Poke these values into the gadget struct. IMAGES: 1. X 2. Check 3. Start 4. Quit 5. QuestionMark 6. EndTurn 7. RightHandSide (The texture of the right hand side of the board) The right hand side thing is not really a gadget. Its just a brush. All gadgets are brushes but not all brushes are gadgets. GadgetImage[0] will be unused. GadgetImage[1] to [7] will be used. GadgetData[0] will be unused GadgetData[1] to [8] will be pointers to the image data. The data areas will each be a different size for each gadget. So how do I handle the memory allocation and deallocation for all these differently sized images? A: Use AllocRemeber() (Might cause some extra memory fragmentation) B: Use AllocPool() (I heard this was bugged on OS 3.0 but there is no mention of any bugs in the OS 3.1 DevCD.) C: Have another array of ints for the size of the data GadgetDataSize[0] to [7] * I choose option C. It seems easy enough. Sept. 17th, 2000: I have the gadgets in but the end turn gadget and question mark gadget have a big black box around them. There is no way to specify that color #0 (or any other color) should be transparent. This makes the right hand side look awful. Possible Solutions: A: Write a special rendering hook function for my gadgets to draw them with the blitter in such a way as not to destroy the background. I don't really know how to do this though. B: Switch to using GadTools.library (I assume that gadtools gadgets can be specified as having a transparent color 0) I don't know anything about gadtools though. C. Simply redo the gadgets such that they have the backdrop built into themselves. This is the easiest thing to do. This also means that if someone redraws the right hand side then they must also redraw the EndTurn, QuestionMark and Mount gadgets to fit. I will do C since I don't have to read any documentation or figure out any paremeters or anything. * Included Xav's new French versions of the Start and Quit gadgets. * The game is now 99% playable in French. Everything except the menus and docs has been translated. * Added in those 2 gadgets for the hires screen. * REMOVED the old hardcoded TickImage and CrossImage from Init.c/Init.h ************************************************************************ End IFF Gadgets ************************************************************************ * I antialiased Xav's new rotating Generator and included it into the game. * Version 3.0 completed on September 20th, 2000. It contains 904 tiles. Size of 3.0d executable is 339564 bytes. 3.0d consumes 10.3 megs of hard drive space. * UPLOADED v3.0d to Aminet on Thursday, September 21st, 2000. My internet account has only been giving me around 300 cps lately, but I got 1100 cps while uploading chaos! It's a miracle!!! September 24th, 2000: Frédéric writes: > * I cast "stone to flesh" on one of my dark wood trees and moved it next to > an independent ghast. However, it did not get engaged to the ghast and I > could not attack it on the same turn. I could not exactly duplicate this bug. When I moved my Dark Wood next to any enemy it got engaged, however when I clicked on the enemy to attack it, no sound was made and the graphical attack effect was not shown. The attack actually did happen though. The enemy lost the appropriate 2 hit points. This was caused by code that suppressed the attack sounds & gfx for the Dark Wood (so as not to get boring and annoying when its SpecialCombat attacks 8 adjacent enemies). I tweaked the code to only suppress the combat sound and graphical effect when the Dark Wood is inanimate. NOW FIXED. * INTEGRATED Frédéric's improved asm music routines into the game. The music system now resides in the dir AsmMusicSystem/ I didn't know what to do with the file proplayer.a so I just left it out. Everything seems to work ok but the subsong bug is still there. I did a simple memory leak test and a simple mungwall hit test. Everything seems ok. We can now allegedly play MMD2 songs from Octamed Sound Studio Professional from 1 to 64 channels. * FLAW: When you select a spell from your list, the erased area is 1 pixel to big. NOW FIXED. * ADDED part of the code to support PlayByEmail. ----------------------------------------------------------------------- Problems caused by a bug in RestoreCellWizard() (It wasn't doing a BackUp() it was just overwriting whatever was there) * When the mount of a wizard is killed, it leaves no corpse behind. Tested and works perfectly. NOW FIXED. * When a wizard dismounts something onto a scroll, the scroll is destroyed. NOW FIXED. * Above fix causes collapsing meditations to reappear once the wizard moves off of them. NOW FIXED. ------------------------------------------------------------------------- Frédéric bug reports for v3.0 +++++++++++++++++++++++++++++++++++++++++++ > * I had saved the preferences with Music off, but when I restarted the game, > the music was switched back on. However, the menu "Music" was unchecked. > When I selected it, another module was restarted, then I could switch the > music off by reselecting the item. Seems you forgot to read this preference > item before starting the music. NOW FIXED. > * The left amiga key acts as "q". Actually, I guess every keypress of a > qualifier triggers the very last action done on the keyboard. This was caused by the fact that MapRawKey() maps qualifier keys as nothing. That is it doesn't even put a 0 into the buffer. So the buffer was left holding whatever key was pressed last. NOW FIXED. END Frédéric bug reports for v3.0 ++++++++++++++++++++++++++++++++++++++++ WARNING: You should not use illegal hacks of the "Automatically activate any screen that is ever in front" variety. This is simply improper and just won't do. Hacks like this will not crash Chaos but they will cause it to behave in an annoying manner since hacks of this nature will constantly activate the WRONG screen. Do not use "AutoActivate FrontMost Screen" hacks. Failure to heed the above warning may cause the screen scrolling to stop working. This will prevent you from reading certain lengthy spell descriptions. MCP has such a hack. It should be turned off when playing Chaos. * FIXED that rawkey problem on the 2nd creature info panel that prevented screen grabbing! (Pressing ANY key at all was clearing the screen). NOW FIXED. * STUPID: Computer wizards senselessly cast Dark Wood trees adjacent to themselves. I have now implemented more advanced AI for use with this particular spell so this is NOW FIXED. * Several new predicates to support the new AI: int AdjacentFriendlies(int source, int cell); int AdjacentEnemyUndeads(int source, int cell); int AdjacentFriendlyUndeads(int source, int cell); int AdjacentEnemyWizards(int source, int cell); int AdjacentFriendlyWizards(int source, int cell); int AdjacentEnemyUndeadWizards(int source, int cell); int AdjacentFriendlyUndeadWizards(int source, int cell); * INTERLACE PROBLEM: Sometimes AGA users complain that certain chaos screens are in interlace. They want to make use of their AGA chips + their multisync monitors to produce a 100% solid flickerfree display. So I have now added a new cli startup option -d to force chaos to open all its screens in doublepal mode. I also added a new startup script and icon so chaos can easily be started in DoublePal mode from now on. DoublePal modes are noninterlaced and flicker free. NOW FIXED. * ADDED Polski, Norsk, Svenska and Finnish to the language menu. Complete info on Polish fonts and charsets is at Aminet:docs/misc/PolishCharset.lha -------------------------------------------------------------------------- September 27th, 2000: I _finally_ got a finished polski.catalog from Artur. Here are the problems: Scavenge -> Padlinoűerca is too long. Can you think of a shorter word? Scierwojad, Padlinozerca, Sëp (bird that eats dead animals), Mordobocie. Padlinozercy (plural noun), Fei says: Zerowac with dotted Z is a verb that is what I want. Ranged Combat -> Walka Na Dystans is too long. What is polski for "Shoot"? Maybe "Shoot"->Strzelac or Strzal or Strzelanina would work better? Or perhaps WalkaNaDystans? Strzal for Shoot is what fei says to do. Magic Resistance -> Odpornoôę Magiczna is too long. How about "Magic Resist" or "Resist Magic"? ?? Przeciwmagia=AntiMagic, Odpornosc na magie Odpornosc mag. is the way fei says to do it. --------------------------------------------------------------------------- * ADDED new code to make the top half of the 2nd creature info panel fully stringwidth sensitive. (I had already done this with the bottom half). This allows the Polski translations to fit without overlapping. DONE. * ADDED new code to make the text on the score screens fully stringwidth sensitive. This allows the polski translations to fit without overlapping. The numeric columns are unchanged. Seems to work ok. * Implement translated menus: 1. Make the strings into the catalog file and defines.h 2. Change ChangeLanguage() to put in the correct text via Message(M_?) into each of the menu fields. 3. Calculate the length of the menu name and of the longest string in the menu. The Intuition menus are now fully international and automatically adjust to the length of the strings in the menus. ALL DONE * Added code to center the translated strings of the demo over screen. DONE. * Fixed spell descriptions for Hydra, Flood Shield, Marid and Protection. *********************************************************************** THE LINKER HAS ATTACKED ME AGAIN!!! *********************************************************************** SLINK WITH temp_smk.tmp Slink - Version 6.58 Copyright (c) 1988-1995 SAS Institute, Inc. All Rights Reserved. Error 502: _sprintf symbol - Distance for Reloc16 > 32768 First Reference in Unit cast.c at offset 00003a04 in file 'cast.o' To Unit sprintf.c at offset 00001690 in file 'LIB:scm.lib' Caused by line 1929 in file cast.c I added 200 lines of new code to cast.c today. And this error started happening. I read the docs. They say to compile the file with code=far. But I already do that. I got this same error or a very similar one a few months ago so I had to add code=far to the compilation of cast.c. The docs also say that you can "declare the function to be far". But changing stdio.h prototype of sprintf sounds like a very bad idea. So I tried to compile the whole thing with code=far. I changed stdops to include code=far so that ALL modules would be compiled with cod=far. Then I did smake clean smake. It all had no effect. The docs say scm.lib is a lib of floating point stuff. But I don't do any sprintf floats in cast.c so I just totally don't understand this whole entire thing. The sprintfs in cast.c are all %s or %d. So what am I supposed to do???? As far as I am concerned this must be a bug in the compiler or linker. I am compiling cast.c with code=far therefore there should simply not be any 16-bit branches in it. Therefore I should not ever get any 16-bit branch errors. Solution: Remove a bunch of code out of cast.c to make the code smaller. I am transferring all routines having to do with scoring and sorting cells for intelligent pit casting purposes into a new module IntelligentPitCast.c This has the code for intelligent Pit, Magic Glass and Weak Wall casting. This problem will probably resurface the next time I add in a bunch of new spells. Oh great! Now the compiler says I have conflict between 2 variables! I have static int id; in cast.c static UWORD id; in IntelligentPitCast.c and it says these vars are conflicting with each other!!! This is scary! They are supposed to be 2 completely different vars, each local to their own file! newl tested this same type of thing on gcc and it worked perfectly, exactly the way that it should. The 2 id vars were each completely different and independent of each other and it compiled perfectly. That's 2 major SASC bugs in 1 week! :( Ok I have hacked and slashed my IntelligentPitCast.c code to only share the vars that are absolutely needed in order to work around this evil bug. But this could cause other very serious problems now, or in the future (when I add another intelligence module) :( Arrgh! Now I'm getting multiply defined symbols. It says every function in IntelligentPitCast.c is multiply defined. Ok this is because I had in cast.c: #include "IntelligentPitCast.c" instead of the correct #include "IntelligentPitCast.h" So this variable conflict wasn't a bug after all! But that Reloc16 > 32768 thing is still a bug in the compiler. *********************************************************************** END THE LINKER HAS ATTACKED ME AGAIN!!! *********************************************************************** * Installed the new HUPL versions of all the fonts. These are the standard gamefonts modified by Attila the Hun to have all Hungarian chars in the proper places and then modified by Frédéric Delacroix to contain all Polish chars in the proper places. I then had Sau test the ChaosPearlHUPL font on his Amiga in Hungary using a Hungarian keymap and he reports all chars are there and everything is ok. * New function to support the new AI: FirstAdjacentHumanAlly() October 7th, 2000: * FLAW: Deutsch.catalog on 2nd scroll info panel goes off the right edge of the screen. Everything was working great with the English, Français and Polski catalogs But when I got the Deutsch.catalog it was going off the right-hand edge of the 2nd scroll info panel. I have now changed that panel so that the left column is right against the left edge and the right column is right against the right edge. * Goblin Bomb now picks up bows just like a regular Goblin. October 8th 2000: * Compiled v3.01d for Robin. The main executable is 349900 bytes! ######################### GOBLIN BOMB VOTING ################################## Vote: If you shoot a scroll of a Goblin Bomb, do you want it to explode? You may vote for it to explode (+1 point) You may vote against it to explode (-1 point) Or any number in between. James: +.25 Sean: +.8 Joseph: -1 Zoltan: -1 Frédéric: -.75 Xavier: -.25 JJ: -1 Total: -2.95 * Changed/fixed Goblin Bomb to no longer explode when shot. October 11, 2000 * Also fixed it so that: * Shooting a scroll of an Earthquake, Generator, Stone Golem or Stone Giant no longer shakes the screen. * Shooting a scroll of a Hidden Horror no longer causes a Red Dragon to appear. * Shooting a scroll of an Elemental no longer causes it to become its Elemental Form (water, fire, tempest, earthquake) ####################### END GOBLIN BOMB VOTING ################################ ************************************************************************** BEGIN Ruthlessness Mode ************************************************************************** When Ruthlessness mode is activated computer players will: 1. Cast pits, magic glass, walls, rocks and miner willy more intelligently and aggressively. 2. If they are an arborist they will cast shadow wood and dark wood trees in a more aggressive and intelligent manner. 3. Whenever a creature is engaged it will always attack the strongest creature that it can acutally kill. If it cannot make a kill then it will attack whichever enemy it feels is the most dangerous. 4. A shooting creature will always attempt to shoot the strongest creature that it can actually kill. If it cannot make a kill then it will shoot whatever enemy it feels is the most dangerous. They never try to shoot a wizard who is inulnerable or has a reflector. 5. A nonengaged ground creature will always check first if there is a path to any enemy wizard that it can kill. If it cannot kill any enemy wizard then it will check if there is a path to any favorite-food creature that it can kill. If it cannot kill its favorite food then it will check if there is a path to any bonus-spell creature that it can kill. If it can find a path to one of those things then it will charge after it and kill it! * Implemented new AI code for ruthlessness mode. Now ruthless computer players will cast pits, magic glass, walls, rocks, miner willy, shadow wood and dark wood trees in a much more intelligent and aggressive manner. This took 600+ lines of code and quite a lot of time. It added 7k+ to the size of the executable. * Conducted various tests of the new ruthless casting code. Everything seems to work ok. * Implemented new AI code for ruthlessness mode. Now computer shooters shoot the strongest thing that they can kill. If there is a tie then they shoot the most dangerous opponent. Wizards will not shoot and kill a creature protected by Eye for an Eye. * Conducted various tests of the new shooting code. Seems to work ok. * Implemented new AI code for ruthlessness mode. Now engaged computer creatures attack the strongest thing they can kill. If there is a tie then they attack the most dangerous opponent. Wizards will not attack and kill a creature protected by Eye for an Eye. * Conducted various tests of the new engaged attacking code. Seems to work ok. * Implemented new AI code for ruthlessness mode: flying nonengaged creatures attack the strongest thing they can kill. If they can't kill anything then they attack the most dangerous thing they can hit. If there is nothing they can hit from their current position then they fall back to the old movement routine. * Conducted various tests of the new nonengaged flying attacking code. Seems to work ok. Implement ground-based nonengaged creatures seek a good kill. (wizard, favorite food or bonus spell creature). If they can't do any of those things then they just fall back to the old movement routine. I spent 2 hours thinking up an algorythm to allow creatures to find their away around ANY set of obstacles to reach a desired goal. I came up with a recursive algorythm that would be ok for up to 6 movement points but it would take several hours in the worst-cast scenario of 15 movement points on an empty board on a 25 Mhz 030 So then I spent 1 hour thinking up a split "search from both ends" strategy which would do 2 6 mp recursive searches. One from the source and one from the destination. This would have allowed all paths up to 12 movement points to be determined and would only take a few seconds in the worst-case scenario. Actually, I just realized this totally would not work at all because there can be multiple desired destinations... so it would only work if there was only 1 desired destination. With optimizations for not retracing steps and not taking paths for which a shorter route already existed I could do 7 mp search with no problem. Then I spent 2 hours coding the above routine and I began to realize how amazingly inefficient a recursive search was. yuk... So then I spent 3 more hours inventing a new search algorythm that is not recursive and is amazingly fast! It should be able to determine the BEST path to all points on the board in around .025 seconds on 25 Mhz 030. If the board was 4x larger than it currently is then it should take about .1 seconds. 6 more hours of coding and it was ready to be tested. A couple of days later: well I had to make some adjustments and things to make everything work within the realm of Chaos. But now that it is done, IT IS TOTALLY AWESOME! I built some complicated mazes and then pressed the "m" key and it correctly showed all the places I could and could not move to! I kept randomly deleting pieces of walls and putting new walls elsewhere in an attempt to confuse it but it worked every time! WAY COOL! I had always been planning on optimizing the C code to make it go faster, or to rewrite it in asm if needed but it goes SUPER FAST on the very first try! So there is really no reason to optimize it at the present time. It is fundamentally a very efficient algorythm. I can now theoretically program computer creatures to find a path to any desired goal. However each goal that is searched for will have to be specially programmed in. This algorythm only finds clear paths to every square on the board. This algorythm does not currently try to calculate any sort of "hack your way through these certain barriers to reach your goal" type of stuff. This algorythm takes into account the fact that once you are engaged you can attack any adjacent square, even if you only have .1 movement points left. * BUG: There has always been a bug in the game whereby if you move some squares and then have only .5 to .9 movement points left it lets you move another full square! This is cheating! It takes 1 whole movement point to move in a straight line and 1.4142 movement points to move diagonally! I have now changed the inappropriate occurrences of "0.5" in move.c and cmove.c to say "1.0" now. However, you can still cheat and step diagonally on your last move when you only have 1 movement point left. SORT OF FIXED. I will work out a way to fix this last flaw later. Later: ok the movement system now works exactly the way it should. This is all 100% NOW FIXED. * IMPROVED cmovenonengaged() to take an extra path parameter. When this parameter is not NULL, the movement information comes from the path rather than the ChooseDestination() function. This way anytime I have calculated a path for a creature to follow I just keep calling cmovenonengaged() to make it follow the path. This way I am using the EXACT same movement code for both normal movement and path-following movement. So everything should always work perfectly. * Ok, I've got the path code in and working and computer-controlled creatures can now follow complicated paths to their destination. As I watched a 14 movement-point Hydra navigate a complicated obstacle course on his way to kill a Generator I noticed the following 2 bugs in the old original computer movement routine: * BUG: The computer movement routine deducts 2 movement points for each diagonal move instead of the correct 1.4142! This applies to computer creatures AND computer wizards! NOW FIXED. * BUG: The WRONG movement point value is shown all the time. It was taking the actual movement points left and rounding them DOWN to the nearest lower integer. NOW FIXED. * Line 58 and 59 in the catalog file are no longer used. They only showed movement points as (wrong) integers. Line 91 is now used instead. * Added code so that nonengaged exposed wizards will run into an unoccupied meditation if possible. * Modified "m" key to work, even in the middle of a creature's movement! I've been wanting this feature for years! I finally did it! And now that I've fixed all those 10 year old bugs in the move routines the m-key highlighted squares now agree perfectly with the printed numerical value at the bottom of the screen and with how far you _actually_ get to move your unit. * FIXED FindAllPaths() to handle mounts + level 2 mounts when the SourceCell contains an exposed wizard. (It already handled meditations). DONE. * FIXED "m" key ground movement to handle mounts and level2 mounts + ride. * FIXED "m" key flying movement! Just use the old code. DONE. (FindAllPaths is only for ground movement.) * FIXED "m" key flying movement to take into account "WillIGetEngagedIfIMoveThere". This way cells which you cannot directly fly to, but you can fly next to them, become engaged and then attack them will now be correctly highlighted. * Modified io.c to load/save Ruthlessness var finally. At the beginning of the Ruthlessness upgrade cmove.c was 24.5k in size. Now it is 61.5k! ************************************************************************** END Ruthlessness Mode ************************************************************************** Robin Schmidt writes: > The Pyrohydra has combat 15 and ranged combat 5. > But the discription tells me that the breath fire of the pyrohydra is one > of the strongest. I suppose you swaped the numbers? Wow! What a cool bug you found! I swapped the numbers back around. NOW FIXED. > 1. When questioning a cloaked object, the German text is too long. > We need a line feed + carriage return 8-) It took me 90 minutes to hack and slash an AntiAliasWriteTextLength() function together for this purpose. NOW FIXED. > Just had a game: I played with four wizards in my team against four computer > wizards and four generators. Everything enemy to me is destroyed. I attached > the savegame. When I cast the seperation spell the fight can go on, but why > doesn't the game finish now? My team has won! Team/Alliances and ending the game. End of Game Check will do: IF (everyone alive on the board is on the same team) THEN IF (all of those people were ORIGINALLY on the same team at the start of the game) THEN (The game is over, that team wins!) ELSE ? FD says to do nothing because this can make the game last a very long time and force a player to sacrifice multiple dragons via Justice/DarkPower/Vengeance in order to get bonus spells that allow for killing an unwanted reflectorized allied wizard. END_IF END_IF * Above code implemented. * BUG: Team[] gets saved and loaded with the savegame file but not TeamSettings[]! I have now fixed this, this means the savegame format has changed again. I am deleting all my old saved games and I am converting all the levels to the new format. NOW FIXED. > 2. The Nightmare has a combar value of 1? I think it should be higher, for > 'it's feet are burning hot' or something like that. I just deleted the sentence "They attack with their hooves which are burning hot." from the spell description so this is NOW FIXED. Of course now I will have to convince all the translators around the world to upgrade to the new spell description... 8/ > 3. I cast the Dead > Revenge spell on my wizard and he is killed. Now the game asks if I really > want to play on or start another game ('Do you really want to start a new > game?')! I say no and see the generator - MY generator. But my old monsters > are asleep, I cannot do anything. And with the end of the next turn the game > asks again: Do you want to go on? Nay, me says and lo! there my generator > produces a Goblin for me. I can DO something - I can MOVE. But anyway the > game asks me if I want to play another game. Then I reached turn 24 and > everything was out - strange tale, isn't it...;-) hahahahheheehheha this sounds very funny! 8) Here's the deal: When all human wizards are dead the game is supposed to be over. Dead Revenge lets you have some small amount of influence in the game so long as there are other human players in the game. This presumably allows you to take some revenge on the human wizard who killed you so that (hopefully) you can weaken him and make some other human player or computer player or even the independents win. You are the very first player (besides myself) to test the new Dead Revenge spell. For years Dead Revenge didn't let you take ANY revenge at all! It just let you die and then gave the _independents_ a new generator in your place! If you died at the hands of the independents then this was doubly unjust! If you aren't going to play Chaos with all those visitors at your house then you could try playing where you yourself control 2 different wizards on a team against 4 computer wizards on a team. In such a game the Dead Revenge spell would work as you would like it too. (Although there is a theory espoused by certain Chaos Players that says something about it being a bad idea to let your wizard die in the first place 8) Btw: Frédéric wants me to somehow rig the replacement generator to have a chance of generating your wizard back into the game. I haven't really worked out how that would work yet.... I am thinking that after X number of turns it would automatically generate your wizard back into the game. I'm thinking a number like X=20 would work well. I think this would be unbelievably cool in a large multiplayer game. > Another question: When calling the About window it says: 'Return Of The > Wizards'? Why? I asked myself that same question the first time I saw it. The answer is: It is a reference to the facts that: 1. There were powerful wizards in ancient times, but their knowledge was mostly lost over time. 2. The game takes place in the far flung future when scientists have rediscovered and reinvented the magical powers that were once commonplace in Atlantis, ancient Egypt and other lost civilizations. Didn't you ever wonder how the Pyramids were built? Well its pretty darn easy when you have complete control over a Brontasaurus. Whole teams of Brontasauri even. But dinosaurs really eat a lot... and they severely overgrazed the land... giant dust storms ensued... the entire area turned into a desert. A terrible ecological disaster from which they still have not recovered 5000 years later. It says "Battle of the Wizards" in some places and "Return of the Wizards" in other places. I was thinking of having it say "Wizard Wars" or "Strategy Game of the Century" or ? But it seems ok like it is. October 19, 2000: * CHANGED spell descriptions of: Bat, Nightmare, Virtue. Sent them to FD and SF. Included new FD French versions. * ADDED code to keep track of total time spent playing chaos and total number of turns played. Now I just have to decide where I will display this information. October 20, 2000: * Sent v3.01 to FD for betatesting. * INCREASED the code to keep track of total time spent playing chaos to keep seperate totals for each of the 8 players + the independents. * Added code to switch to the HUPL font when selecting Hungarian or Polish from the Language menu. * Chaos release executable is now 368704 bytes in size. * The toe of the Babboon is all messed up. NOW FIXED. + I drew some blood on the dead body. * Pieces of the Skeleton animation were not antialiased. NOW FIXED. * Amphisbaena is all messed up! NOW FIXED. ********************* BEGIN Robin Stuff ******************************* Robin writes: > 4. I think the Goblin Bomb makes it too easy to kill generators. Try it: > Place a Goblin Bomb next to a generator. Shoot at it until it dies. > Destroy the generator with any adjectant creature (even an orc). > It's far too easy!?! Well in a "real" game with say 8 generators it isn't so easy. I mean, first you have to _get_ the goblin bomb next to a generator. This is easy if your wizard is standing next to a generator but if you are standing next to a generator in a normal game then you are probably going to get killed very soon. Perhaps this is why you like Dead Revenge so much? 8) hehehe Ok so if you are a safe distance away then you have to walk your Goblin Bomb up to the generator and it will be very challenging to get him there without some independents killing him prematurely. Also, I have found that it is quite challenging to get a Goblin Bomb into position without at least taking some damage onto my own creatures. And lets say that you are such a good tactician that none of what I have just said applies to you. Well its ok for it to be "easy" to kill 1 or 2 generators in a game. Its the only way to survive when playing against 16 generators! And lots of times I've had Goblin Bombs but no shooting creatures. So I get my Goblin Bomb into position and then some bozo comes along and kills him! Then they kill the generator! So I don't get any bonus spells for it! > My dear, you talk too much. But what is most anoying - you are right. So we > leave the topic. > Now my great BUG!!!: > Yesterday (or tomorrow, don't know) I got the Touch Of GOD (nice one 8-)! So > I made my Wood Elf a godlike creature. A when it moved around killing here > killig there killing everywhere it suddenly was promoted to a Dread Elf > (ooohh, how dreadful)! But then I saw that his life force was decreased, and > so were Magical Resistance and healing capabilities! That's no good, my > dear. And I presume this 'feature' can be used with any promotable creature > that is under the Armour and Protection spells. No other values were changed > though, so my dread elf was still of much use to me... Ok I read over the code that controls this and I see no possible way this could happen. All the stats are promoted the same way so they should either all promote correctly or none of them should promote correctly. So I played a test game and cast Touch of God onto my Wood Elf. On the 4th kill he was promoted to a Dread Elf. The only thing wrong with him was that his manuverability didn't promote right (I forgot to promote that stat in the code). So the Manuverability stat promotion is NOW FIXED. The only thing I can figure is that your Dread Elf was attacked by a creature (while you weren't looking) that caused the leben damage. Possibly your Dread Elf was attacked by something holding a Poison Dagger, that would mess up your leben recovery rate. And that you just mixed up manuverability and magic resistance. > NO! There > was another thing I forgot to tell you: The Leben (you have to write it with > a capital letter in German 'cause it's a noun...) value was increased by > using the Armour spell (which was called by the Touch Of God, I think), and > then, when I call the info panel, I see from the pictures, what happened to > my elf (there were the Red Cross, the Shield, the Range Boost Arrow and... > and the Armour). After he was promoted, there wasn't any Armour sign any > more! Im totally sure about that! The Armor sybmol is algorythmically generated each time you look at the info panel. If your life is 15 points higher than your normal maximum then it draws the Armor symbol. Several other symbols work in a similar fashion. So your Touched by God Wood Elf had probably taken a few hits during his conquests right? Lets say he had taken a few hits and was down to only 50 life points. Well when he got promoted to a Dread Elf his normal life would be 39 life points but he still keeps his 50. 50 is not 15 higher than 39 so it would stop drawing the Armor symbol. Dread Elves come with 39 life points built-in. So for it to draw the Armor symbol would require him to have 54 life points or more. There are still lots of strange things in the game that you haven't found yet. And some secret things too. > I just found one: I made my Magic Wood > walk via StoneToFlesh. I boosted it a little bit with some Combat training > and tried to attack the next wizard. Well it worked fine, but then the > wizard just entered my Magic Wood and disappeared! I could still move my > Wood and attack, but the wizard remained in it. Some turns later my wood was > destroyed from within by the evil wizard and he got a spell. :-( Hehehehe *************** END Robin Stuff ****************************************** *************** BEGIN Frédéric Stuff ************************************* FD Writes: > I saw once (I think it was when a wizard had just been killed) a string > like "Movement points= -98.50). I can't remember the exact circumstance > unfortunately. I looked over the code and I only saw 1 place where this could be theoretically possible so I rewrote that piece of code. ALLEGEDLY NOW FIXED. > * Something has changed about shadow wood. It seems to me that they don't > attack anymore when computer-controlled. The code used to erroneously say (This used to let people cheat and move 1 extra square sometimes.) DO_WHILE (moveleft >= 0.5) So I erroneously changed it to: DO_WHILE (moveleft > 1.0) Which prevents things with exactly 1 movement point from moving. Now I changed it to the proper: DO_WHILE (moveleft >= 1.0) NOW FIXED. > * I cast alter reality on a wizard's mount and it was turned into a > goblin bomb. However, the goblin bomb did not explode when I killed > it. It should explode, but should the riding wizard be harmed too ? I > think so but ? That's hilarious! You come up with the weirdest stuff! :) 1. Goblin Bombs have never done the explosion effect on empty cells. I did not attempt to change this. But someday I would like to have just *1* really BIG, 9-tile big (3x3) nuclear explosion animation that we can use as the cell effect animation for this effect. Or actually it could be ANY animated explosion whatsoever. 2. With clever rewriting of the Reinstate() function I was able to make mounted Goblin Bombs explode as usual. NOW FIXED. 3. Goblin Bombs have never harmed the cell that they are in. I have now hacked in some extra code so that they now damage a mounted wizard. Same thing for the Volcano. NOW FIXED. ****************** END Frédréric stuff ************************************* October 26, 2000: Sent a new v3.01 to FD for betatesting the AI. Executable filesize = 368892. Sent a new v3.01 to SAI for betatesting the AI. Executable filesize = 386456 This means the level editing code is 17564 bytes in size. ========================================================================= FD Writes: > * I vanished a horse into the future, and it reappeared some turns later in You vanished a horse?? Was this a really BIG, bad, scary horse or something? :) > the rightmost column. But the drawn area was 1 pixel too wide, damaging the > spell selection graphics. This was refreshed very quickly though. Actually, > this seems to happen everytime something is drawn in the last column. I think it only happens during the CellEffects TELEPORTIN and TELEPORTOUT. NOW FIXED. > * When a creature gets promoted, its manoeuvrability recovery is reset, not > kept. NOW FIXED. ========================================================================== October 29th, 2000: I voted straight Libertarian. I also voted against the lame "Arena Proposal" to give millions of tax dollars to the Houston Rockets & Comets basketball teams. ----------------------------------------------------------------------- FD Writes: > * A sleeping ghoul is still animated and scavenging. I can't remember > exactly how it happened, but this could be due to impurities. NOW FIXED. > * If a computer wizard has a solar, then the solar does not move. NOW FIXED. > * I noticed that since you introduced the new dead revenge, when a creature > changes side to that of a dead wizard (haunt or impurities), this wizard > gains control of it, even though he did not cast dead revenge when he was > alive. Is it a wanted effect ? Yes, this is a wanted effect. The new rule of the game is that if a wizard owns things on the board that are not asleep or dead or a scroll then he gets to use them as usual. Even if the wizard himself is dead. This is what allows Dead Revenge to be such a useful spell now. > * Unless I missed something, when I cast a vortex on a corpse, the corpse is > destroyed when the vortex moves. It should either be vanished, or left > behind. This is a game secret. Just because the corpse is not there when the vortex moves does not mean it is destroyed. Can you figure out where the corpse has gone? > * In one of the first emails we exchanged, you told me you'd change the > magic knife to improve combat by only 2 points instead of three so that it > is really different from magic sword. It seems to me it still adds 3 points. Someone must have cast vodka on you again. You are imagining things again :) Wait till you sober up then try casting Magic Knife again and you'll see that it works properly. :) > * It would be nice, in the bonus panel, if the number of spells to pick was > decreased each time I pick a spell. NOW DONE. > * During spell selection, when I press "c", it shows me where I can cast the > spell under the mouse pointer. But then I must click elsewhere to be able to > press "c" again on another spell. It would be nice if we could press "c" on > different spells without having to click in between. This is a problem with _all_ keypresses, not just the "c" key. Originally I programmed all keypresses to work exactly the way you describe. Then one day Sean changed it. I didn't like it but I assumed he had a good reason for it so I decided not to mess with it until someone complained about it. NOW FIXED. END FD Writes. ------------------------------------------------------------------------ * November 1, 2000: Sent v3.01d (19) to Artur Chlebek for testing the Polski translation of the .catalog file and the HUPL fonts and the Screens/Polski/ The executable was 369192 bytes. * Included Stephen's Magyar spell descriptions A-Z. They still need to be spell-checked. * Robin wants a special version with a time delay on what the wizards are saying/thinking during their spell-selection AI. Sent v3.01d (24) specially modified to him. November 2, 2000: Artur Writes: > It seems that there is something wrong with support for HUPL fonts - I > checked them in DPaint and all polish chars are OK and in proper > "places". But Chaos doesn't seem to use them - only script font > (ChaosHUPL) seems to be used when proper option is enabled. All other > fonts (ChaosCalligraphy & ChaosPearl) seems to be used in original > versions - not their HUPL equivalents. :/ > >> Can you give me an example string where the char is wrong and I will >> check this. > > /"Name/ wybierz zakl_e_cie." (polish equivalent of "/Name/ select your > spell.") - underlined "e" has some 2 dots on the top of it, while it > should be a mix of "e" & ",". The problem was that I closed the old fonts and opened all the new ones correctly but that is not enough. The fonts must be plugged into every rastport and screen in the game. NOW FIXED. * Sent a new v3.01 (20) sto Artur for testing the fixed HUPL font support. executable filesize = 369668. * FLAW: In Ruthlessness mode, flying creatures seem to take about 6x longer to move than in regular mode. This is noticeable on my 25Mhz 030 but perhaps not noticeable on faster machines. NOW FIXED. * FLAW: The "m" key can take up to 1/3 of a second. The above fix now makes the "m" key around 10x as fast (in other words, back to being as fast as it was supposed to be). * FLAW: Computer creatures in Ruthlessness mode take up to 6x longer to decide who to shoot. NOW FIXED. FD Writes: > * A (allied) computer wizard cast 3 pits around a generator in a corner. He > had 5 pits left to cast, and he could do so around a generator on a border, > but he chose to cancel the spell. He didn't actually cancel the spell. He cast the wall pieces into various parts of your computer's memory :) This triggered jillions of enforcer hits on my machine. This bug happened when a computer player tried to surround something that was on the edge of the map. ALL NOW FIXED. While watching the computer cast Weak Walls in FD's supplied autosave, at first I thought that the computer was casting them a bit strangely. He could have cast just *1* pit into the upper left corner and that would have completely blocked off 1 generator. But then I carefully examined what the computer player did and I realized that _EVERY_ wall that he cast blocked off a generator! One of the walls even blocked off *2* generators! And all the generators that he blocked were closer to him than that obvious one in the corner! So he was actually being rather intelligent about the whole thing. > * When Virtue kills a bonus creature (white dragon, stone golem etc), no > bonus spell is awarded. NOW FIXED. Btw: There are only 3 bonus spell creatures that Virtue currently kills: White Dragon, Stone Golem and Air Elemental. * FLAW: No points are awarded for killing creatures with Virtue. NOW FIXED. > * An independent red dragon was engaged to one of my undead inanimages, but > he was also adjacent to my dragon nest, which was the only object he could > attack. However, he did not attack the dragon nest, he just shot it. This > makes me think he tried to attack the undead inanimage, which is stupid > since the dragon is intelligent enough to see it's an undead. This is a flaw that has always existed. NOW FIXED in both normal mode and Ruthlessness mode. > * My wizard just vanished because of impurities ! First time I see this ! Actually the line of code that allowed impurities to vanish things was commented out for some reason. I have just now reinstated it. > Actually, he was vanished by an independent chronomancer. HOORAY for the Chronomancer!!!!! He actually did something useful! He vanished your most valuable asset! > The trouble is > that 1) he has not reappeared for a very very long time. I guess this is > because there are no empty cells on the board. They all have at least a > corpse. 2) I don't have access to the menues to quit the game 3) What if the > board was full of independents ? The game would never end and I would never > get the chance to select a menu ! > > * I'm now on turn 148 and my wizard still hasn't reappeared. He was vanished > around turn 80 ! I'm including the autosave. I think this is because the > world is full of corpses. The vanished objects should be given a chance to > reappear on a corpse after, say, 10 turns, or in place of another (random) > object that would be vanished in turn. Ok I have investigated the WarpIn() code that controls the reappearance of warped creatures and yes, indeed your problem was caused by all those corpses. Here is how the code worked: After WARPTURNS have passed, each turn try ONCE to reappear the creature onto the board. This was done by randomly selecting a square on the board. If the square is not TOTALLY EMPTY then too bad for you. You don't get another chance to reappear until the next turn. So in your game if there were only 5 completely empty squares on the board then you would have only 5 chances out of 238 of reappearing each turn. Ok, I have now completely rewritten WarpIn() to do the following: After WARPCOUNT turns have passed then the object in question WILL reappear randomly onto some completely empty square. If there are no completely empty squares then the object WILL randomly reappear on top of some corpse, thus destroying the corpse. If there are no corpses anywhere on the board then some random thing will be WarpOut()'ed then the object in question will be WarpIn()'ed to that now empty square. I tested this new code on FD's supplied savegame. NOW FIXED. > * When a creature which has +4 scavenging and only 1 point to heal, it's > still displaying life +4. I have adjusted it to show the amount that it actually scavenges. Tested and works perfectly. NOW FIXED. While testing the new scavenging code I was playing a little test game. A Goblin Bomb popped out of an independent generator. So I was like "Cool! I'm gonna kill it then kill the generator!" Only 1 problem, I only had 2 creatures. My Goblin and Gorilla were close to the Goblin Bomb, my Wizard was 4 squares away. I had no shooters, no flyers and no creatures that move more than 1 square on my list. So I kept casting various Goblins and Gorillas and as they marched up to the Goblin Bomb to kill it they would get blown away by the independent Ogre Mage who had clear and easy shots on anything between my wizard and the generator. Ok so this was hopeless for the next few turns. Then suddenly I got a spell that I never use: Request! I carefully analyzed everything on my list... I had a LOT of spells that are better than request. I usually just discard Request. But I _REALLY_ needed a shooter or a flying creature or even just a reasonably fast creature like a Centaur or Unicorn. So I prayed and prayed for something along those lines and then cast my Request. > What creature did you get ? If I would have got a Vulture, Eagle, Floating Eye, Unicorn, Centaur, Bolter, Elephant, any form of cat, or any of a number of other creatures then I could have killed the generator on that turn. But nooooo... I got a Ghoul. Luckily Ghouls are undead so that it could survive the 3 or 4 squares he had to walk from my wizard to the Goblin Bomb + Generator. So 3 or 4 turns later I was able to kill the Goblin Bomb and Generator. So the moral of the story is: Even spells that one never uses, _can_ be vital in certain rare situations. * BUG: Using the "m" key on an engaged creature sometimes produces somewhat wrong results. NOW FIXED. Robin Writes: > I tried the Brustroem's Browser spell. > I used the spell and look into the different spell books. But when I > wanted to choose a spell, the game did not let me choose from my list but > from the list of player 2. I attached a savegame. Ok the last time I fixed Burstroem's Browser I wrote the right code but I put it in the wrong place. This means that for the last 4 months the spell has been letting people CHEAT and cast spells from other people's spell lists! NOW FIXED. November 5th, 2000: * Added the 7 yes/no type strings to all the .catalog files. SAI writes: > Speaking of the info panels I've recently decided it would > be nice to be able to see the life of a creature by simply > placing the mouse over it. How about at the bottom of the screen: Wizard 1 (Sean) Life 19 NOW DONE. November 6th, 2000: * Sent v3.02 to FD and SAI for further playtesting. Executable filesize = 370196 * Sent v3.02t (23) to SF for testing Hungarian font support, etc. * The newsmedia is stupid. re: Election. November 7th * BUG: M key shows that I can attack undeads when really I can't. NOW FIXED. * FLAW: The scroll panel does not 100% handle spell descriptions that are not all on 1 line. NOW FIXED. * Added code WaitVBlank(2); to all the keypresses so that, for example, when you are holding down the "s" key to see where you can shoot, the flashing is more solid and pleasing to the eye. * Made an archive backup of all English Spell Descriptions to sc:SpellDescriptionsBackup.lha * Ran FD's ReflowSpells.rexx script on the English spell descriptions. It didn't flow them like I wanted. It went well beyond the defined LineLength var. So I changed the script a bit and now it flows EXACTLY like Cygnus Ed Professional does (Format/WithoutFill). * Henceforth I will keep all spell descriptions with a max line length of 77 chars. * Casting Brain Boost on a creature with max intelligence now raises its intelligence recovery by 1 point. * REWROTE Double and Triple spell descriptions to say that you cannot double or triple any spell which grants multiple attempts. * BUG: When 3 lines of text are displayed in the bottom text area of the main screen, lines 2 and 3 overlap each other a bit. NOW FIXED. FD Writes: ------------------------------------------------------------ > * I was asked a very strange question: "comrade nobody, would it be OK for > you if I put this weak wall there next to your nothing ?" :-D ROFL ! NOW FIXED. > * The answer to the question that was accepted was "y" and not "o" as is > supposed to be in french mode. NOW FIXED. > * Something is wrong with the cloak graphics, I'm always mistakening it as > "X-ray" ! I cloaked an enemy golem ! Well I programmed a really nifty gfx system so that you can redraw any spell that you don't like. Btw: hehehe its very funny that you cloaked an enemy golem. :) Your AI must have some bugs in it. :) END FD Writes ---------------------------------------------------------- * CHANGED Wood Elf to require 5 kills to promote to Dread Elf. After extensive playtesting I have come to the conclusion that a Dread Elf is just to powerful to be allowed after only 4 kills. It should be changed to 5 or 6. Btw: it was _originally_ 5 kills when Sean first implemented it so I'm just setting it back like it was. While creating the new CellEffectList() function I noticed that the algorythmic sound effects controlled by the menu option only apply to independent creatures. Thus you can turn off the algorythmic sound effects of the independents but not of computer controlled wizards. Should this be changed? * FLAW?: Turning off algorythmic sounds does not affect the sound of the standard algorythmic "attack" sound. NOW FIXED. Sunday November 12th: I have gotten almost no work done since the election. Al Gore is trying to steal our election from us! Using dastardly lawyer manuvers! This is very upsetting and the political chaos is worsening every day :( I can't concentrate on programming under such conditions. :( * Problem: Special combat attacks take too long when there are many special combat attackers on the board. I made a new CellEffectList function and rewrote the SpecialCombatHandler so that all the special combat graphical effects of a particular creature happen simultaneously for up to 8x speed improvement. NOW FIXED. * Robin and FD want your artifacts to go back to NOBODY when your wizard dies (instead of having them fall asleep). NOW DONE. * Problem: Computer-controlled flying creatures keep choosing to attack earthquakes when they should really be attacking the nearby enemy creatures. This is because earthquakes are set to have 15 combat for some reason. I have now changed earthquakes to have 0 combat. Is this ok? NOW FIXED. * Added: FD's new EndTurnSelect.iff and QuestionMarkSelect.iff * Edited / Antialiased QuestionMark.iff and QuestionMarkSelect.iff * FD says Agents should be highlighted while casting spells. I looked into this and there was already code to do this. However they weren't highlighted until the instant that the spell was about to be cast. I have now changed this so that the creature is highlighted immediately, before any text is printed to the screen. Thus the creature will now be highlighted for a longer period of time, without making anything take longer and without slowing the game down any. Hopefully this will be good enough. NOW DONE. * ADDED Highlighting of real Generators because I like the Agent highlighting so much. Robin Writes: > I found another flaw: When using the Move It spell you're suddenly able to > move the Solar on your own account. That's not good my dear oh no... Congratulations, you have discovered another game secret. November 13th: I haven't heard from Xav in weeks. I was going to ask FD to call him on the phone or drive to his house to see if he was still alive or not. I was very worried about him. But today I _finally_ heard from him! He was in the hospital with an appendicitis! He could have died! :( * Random Bug: Sometimes when the game loads Mod.ChaosTheme1, infinite enforcer hits are generated and all the fonts are destroyed. November 14th, 2000: * Assembled FD's new misca.asm for the music system to hopefully fix the above bug. In order to test the new music system bugfix I have decided to play a REAL game of Chaos. I normally either, A: Never play a game of Chaos. B: Only play default games of me vs. 1 wizard and 4 generators. I usually win these games in less than 24 turns. Ok, so now I will try me vs. 1 cpu wizard and 99 generators, Texas Trash'em, 99 spells. Both the cpu wizard and I died on turn 1 4 games in a row. I never started with cloak or lich so it was pretty hopeless for me. Now I am trying me + all 7 cpu wizards in an alliance against 99 generators, Texas Trash'em, 99 spells. Turn 1: I cast Weak Wall and blocked off a few generators. So did 2 or 3 of my Allies! We've already blocked a bunch of generators! Turn 2: I cast Lich on my Wizard. Now I can win! * UNBELIEVABLY STUPID! All wizards are in an alliance against 99 generators. One of the computer wizards cast Coercion on turn 3! Now we are all going to get killed because of this! NOW FIXED. Well we can't defend ourselves now, so a different wizard gets killed every turn. I couldn't cast spells for 5 turns! By the time I could cast a spell to help my allies the last one was dead! (He had been cloaked and recover boosted.) * FLAW: There is never an exophagy icon on my powerups list. NOW FIXED. It is now turn 81 and I've never ever had a Recover Boost the entire game. I did however get 2 Exophagy spells which I cast on my wizard and his replicate. I've decided that Exophagy provides more strategy than Recover Boost. Scavenging provides more strategy than Recover Boost also. Well I haven't seen the random music bug in 81 turns so I guess its gone. However this is not really a bonafide test because I usually play with speech and sound fx on, but this time I have them turned off for speed. Turn 83: I am turning the sound effects and speech back on. Turn 92: I killed 7 generators, a T-Rex and a Stone Golem on 1 turn and now I get to pick any 9 spells out of a list of 30. Then during my next turn, I attacked with my Ghost and the ghost sound got stuck in an infinite loop! And it was generating infinite enforcer hits! Ok so I opened up a shell and typed "who", it said that cli 9 was running the ChaosDigitalSoundSubProcess so I typed "break 9 c" and it stopped the enforcer hits and the sound. But now the game is in some sort of "not accepting any input" mode so I can't do anything in the game. :( During this game I was offered Dead Revenge on my Bonus Spell Selection panel at least 10 times. I never picked it though. I had cast level twice. I theorize that JCsound has some sort of bug whereby if there is a CPU load right at the moment of starting (or buffer switching) a sound sample then there is a finite possibility that things can get hung up. 2nd theory: Something about the computerized speech or the algorythmic sound effects routine is corrupting the audio.device. Anyone who can solve this mystery automatically receives the "Hero of the Month Award" Months later James Conwell finally solved this bug! Oh that's me, thank you. :) * FLAW: The score column is not positioned well on the score screen. My score on turn 92 is 11602 thus placing it up against the Life value. NOW FIXED. * FLAW: Score screen score column is WAY out of position when playing in Deutsch or Polski. NOW FIXED. * BUG: Load any saved game and look at the score screen. The life totals have not been freshly calculated so they are wrong. NOW FIXED. On 14-Nov-00, Frederic Delacroix wrote: > * Uncertainty suffers from the same flow as vanish did before you fixed it. > If there are many corpses, it will almost never generate anything. I changed this so that it can now generate onto empty squares or onto dead bodies. NOW FIXED. Note that if the board is mostly full of "stuff" (creatures, inanimates, growths) then Uncertainity will probably not generate anything for you. Its something to do with some law of physics that says you can't have 2 things in the same space at the same time. 8) November 16th: Sent v3.03 to FD and SAI for playtesting. Executable filesize is 371880 bytes. END OF VERSION 3.03 * EDITED Magic Carpet and Chainsaw graphics a bit. * PROBLEM: I hate the animation of the Bolter. So I just now changed it to something else. It is now somewhat better than before, but still not very good. Someone needs to fix this up. FD Writes: > * A wizard just cast poison dagger on its own bolter. Considering that a > bolter can never attack, this is kinda stupid. NOW FIXED. > * When dismounting, the "M" key shows a lot of places where I cannot move (I > have wizard wings+speed but I can only move one square in this situation). NOW FIXED. * Aaaaaaugh! Reveal was set to only be a ranking of 4! This is why computer wizards never cast it on anyone! I am now raising it to 44 so that, basically, if they _can_ cast it on an enemy then they will. * Sean and Frédéric both hate the green square for cloaked creatures. This same green square is also used to draw unexplored squares. Also FD has complained that the Cloak graphic is easily confused with the X-Ray graphic. So I have now drawn a new Cloak graphic which is used for 3 things: 1. As the graphic for the Cloak spell. 2. As the graphic for a cloaked creature. 3. As the graphic for an unexplored square. If you do not like this graphic then you are free to draw a better one and it will automagically appear in the game. * CHANGED Earthquakes back to 15 combat and adjusted the DangerousnessRating() routine to ignore combat, ranged combat, etc. when rating an inanimate object. I did this so that a person could theoretically cast No Grow then Stone to Flesh on an Earthquake and have a powerful max combat creature. I realize this will hardly ever happen. But it only needs to happen once for it to be all worthwhile. END OF VERSION v3.04 FOR TRANSLATORS! BEGIN VERSION v3.05 NEW SPELLS UPGRADE. * ADDED 16 new spells including: 1 artifact creature 2 other normal creatures 1 meditation object 12 magic spells 1. Global Thermonuclear War 2. Conwell's Cow Catapult 3. Heal 4. Vox Angelica 5. Vox Celestes 6. Resurrection 7. Magic Carpet 8. Tribal Dance 9. Chainsaw 10. Shambling Mound 11. Stomp 12. Delacroix's Decloaker 13. Night of the Living Dead 14. Hand Grenade 15. Feeble 16. Martyr As I feared, when I added these new spells I am now getting that silly >32768 error so I quickly syphoned off all the agentcasting stuff into a seperate file "AgentCast.c". I did this because it looked very small, simple, self-contained and easy to do. But I guess that wasn't enough because I am still getting the the following error: SLINK WITH temp_smk.tmp Slink - Version 6.58 Copyright (c) 1988-1995 SAS Institute, Inc. All Rights Reserved. Error 502: _sprintf symbol - Distance for Reloc16 > 32768 First Reference in Unit cast.c at offset 00003ad0 in file 'cast.o' To Unit sprintf.c at offset 00001690 in file 'LIB:scm.lib' Caused by line 1943 in file cast.c Ok, I syphoned off the intelligent creature casting code into IntelligentCreatureCast.c and now it takes longer to do a complete recompile but at least it works. November 20th, 2000: * Chaos now has 365 spells! 1 for every day of an Earth year! On my 1st test game I started with a Global Thermonuclear War spell! Woohoo! Even though it is only probability 5! On my 2nd test game I started with 2 Magic Carpets, Heal and Tribal Dance! Wow! Its amazing how adding just a few new spells can immediately make the game more interesting! November 21st, 2000: * Included Xav's new Feeble, Hand Grenade, and Tribal Dance gfx. I put Explosion and Kamikaze into gfx/UnusedGfx/ for future use. I edited his new Martyr graphic to show the Martyr hanging high up on the wall. * I Made a new level: Equivalency1 to test all the new spells. It is 1 human-controlled wizard vs. 1 computer-controlled wizard. Both wizards have an identical spell list. * PROBLEM: When an archer loses his archery ability the arcing weapon effect is still drawn. NOW FIXED. * PROBLEM: When a creature that is normally not an archer, gains the archery ability, the straight-line weapon effect is still drawn. I have now fixed this to make it draw the arcing weapon effect. NOW FIXED. November 28, 2000 SAI Writes: > I liked the multiattack made by trees, ropers, fungi, > etc. The only problem is that they make the attack > sound even when there is nothing for them to attack. NOW FIXED. > The sound made by a computer controlled Shadow Wood > is a nice "whoosh", but when a Shadow Wood controlled > by a human player attacks, it is only the traditional > attack sound. I am playing a test game right now and both human and computer controlled Shadow Woods are making the same whoosh sound. Perhaps you meant Dark Woods? Or perhaps you meant Stone to Flesh'd Shadow Woods? or ? > The Consecrate spell wraps off the edge of the screen. NOW FIXED. * Added the Gadget to control Ruthlessness on the 2nd setup screen. * Added Ruthlessness to the ascii prefs routines. December 3rd, 2000: ML sent in 17 Polski spell-translations, + a few words translated from several others stating that I must give him a registered version or he would quit. I tried to explain to him that 17 spell descriptions isn't even close to enough to warrant a registered version. In the time it took him to translate 17 spells, I added 16 new spells, meaning it will never be finished. Artur reports ML's descriptions as full of typographical, grammatical and translation errors. Added Artur's spell-descriptions T-Z (52 descriptions + his new bugfixed Polski.catalog into the game. December 5th, 2000: * Added code to play a special mod when casting a spell if there is one in the Sounds/CastingMod/ dir. Atm, the only spell with a CastingMod is Tribal Dance. * Added code to play a special sound sample when casting a spell if there is one in the Sounds/CastingSounds/ dir. Atm, the only spells with special casting sounds are Vox Celestes, Vox Angelica and Blonde. December 9th, 2000: I spent about 20 hours on IRC before and after the conference. We had 150+ people on the Amiga channel to hear Mick Tinker speak. Normally there are only 30-45 people on AmigaNet #Amiga. It was fun! December 10th, 2000: * Added Artur's T Polski spell descriptions. * Added SF's spell-corrected Magyar spell descriptions (A-Z) December 13th, 2000: aaaaahhhh Al Gore finally officially quit trying to steal the election. December 17th, 2000: Added Artur's Q-S Polski spell descriptions. Artur writes:---------------------------------------------------- Having Chaos limited to 20 turns is something deathly cruel - I just "finished" playing a game with 2 Combat trained Juju Zombies, with 2 Mana Batteries and I stood between these batteries, mounted with a God Touched Haunt. I killed my 6th-level opponent wizard, destroyed 5 generators (1 was a magical Real Generator) and only 3 poor creatures left to slaughter... when I reached 20th turn. You are wrecking my life this way and I am going to commit a suicide (in the way that won't let you effectively use a Raise Dead spell ...I don't know, maybe I'll jump into an aeroplane engine so you will get a gooey blob in place of your favourite translator). ------------------------------------------------------------------ * Added Combat sucking sound for Mind Flayer. * Added FallingIntoPit.8svx for when you fall into a pit. * Added SpecialCombatShocker.8svx for special combat attacks by creatures with MAX_COMABAT (Shocker) * spot^up donated a really cool mod for use in the game! I haven't added it into the game yet. December 20th: * Game over man, game over! For player 1 dying. December 21st: * CastingTwirl.8svx and CastingUndeadTwirl.8svx for use when casting creatures. We still need to come up with a sound for inanimates. The sounds sound very cool! * REMOVED the code that auto-plays CastingSounds/spellname. I think it will work better to have the spells specially programmed to play the sounds. These sounds will only be used specifically by spells. I must still maintain a list of them! So that "HasCastingSound(id)" will still work! But I won't play them automatically!!!!! Just take out the auto-playing code! DONE. * Sent a complete update (with no music) of v3.05 to SAI, FD and Xav. SAI main executable was 395672. FD main executable was 378052. Xav main executable was 378048. Begin v3.06 December 22, 2000: Music/ dir is currently 3.8 megs (3838908 bytes) The only good thing about being totally SICK of programming is that I finally took the time to go through the music files to get the next version of the game ready. I put in ALL the new songs, even the ones that still need some work done on them. I just don't feel like doing any complicated or tedious work on them right now. I'm sooooo sick of hearing the same 10 songs over and over again. We need at least 50 different tunez. * Put in 13.5 megs of new ChaosThemeSongs (11-60) Music/ dir is now 17.5 megs (17551558 bytes) * We now have some spooky tunes, some beautiful guitar tunes, some heavy duty brain-thrashing, mind-melting tunes, some wonderous magical tunes and others. Amiga Rulez da Muzik Scene! EXTRA SPECIAL THANKS TO ALL THE MUSICIANS WHO CONTRIBUTED MUSIC! (Complete list in the docs) * We now have some VERY small mods that can work even in very low memory situations. 15k, 51k, 55k * We now have 4 VERY large mods (over 600K) that will only work on systems with 2 megs of chipram. If you don't have a LARGE contiguous hunk of chipram free then you will never hear these in the game. All 4 of these mods are of the "orchestral" variety so if you are tired of hearing a "hardcore 90's rave soundtrack" all the time then free up some chipram so you can hear these moving musical masterpieces. * I played a test game with the new music. It was me against 7 enemy wizards who were all in an alliance against me. For several turns I was not making any progress. I wasn't about to die, but I was nowhere near being able to kill 1 of the wizards. I noticed the computer guys were attacking really stupidly. This turned out to be because I forgot to turn on Ruthlessness. The new AI really does make a difference. After several turns of not accomplishing much, one of the wizards cast alliance on me! So we were all 1 big happy family! I was able to win on turn 45. The last wizard was cloaked with a reflector and mounted on an undead. This was no great problem. It just slowed me down by several turns. December 24th, 2000: Well I was hanging around not really feeling like doing much of anything when I suddenly thought up an idea for why the Ghost and other long sound samples sometimes freak out and crash the computer. I thought perhaps the WaitJCSound() routine's use of FindPort() could be disabling multitasking for long periods of time. So I looked up FindPort() on the developer CD to see if there were any warnings that it disables multitasking for long periods of time and... YIKERZ! I found something much worse! It has a warning that it does NOT disable multitasking AT ALL so that ANY and ALL uses of FindPort() must be surrounded with Forbid() and Permit() !!! So maybe this has been causing all those weird random audio problems?!???? I made the appropriate changes and played the Ghost sound 60 times under various CPU loads and it never messed up! If this was the problem it would totally explain: 1. The random nature of the bug. 2. The random mess ups of the JCsound, audio.device sound, and maybe even the subsongs! 3. The fact that the problem only seems to affect _long_ JCsound samples. A long sample means WaitJCSound() is calling FindPort() over and over and over again, waiting for it to end. I am very happy about finding this! Now we need to heavily test this to see if all audio problems are now fixed! * BUG: If for some reason you have no music files in the music/ dir, the game crashes. I always wondered why in the WORLD this happened!? Now I know it was because of the FindPort() outside of Forbid(). NOW FIXED. December 29th, 2000: * Artur fixed the English Higher Devil and Lesser Devil spell descriptions. (There was a double "from"). * I added the sentence "Hyperclone will not replicate your wizard." to the Hyperclone spell description. I also edited the first sentence. * I removed the sentence "The powerful magic used in this spell usually produces a horrific, mutated copy of your wizard as a side effect." from the Lich Lord spell description. * Zoltan complained about the Range Boost description so I fixed it up. December 31st, 2000: Joseph, Matt, Jason and J.J. played 3 different 4-player games of Chaos in 3 hours. They played with a bunch of scrolls. On his 1st turn Matt cast Orcs and stepped onto 2 scrolls. This caused 1 of his newly acquired spells to be accessible and the other 1 to go into position 100 where he would never be able to use it. They all agreed this was stupid and they want all scrolls and bonus spells to go to the top of the list from now on. I have now reprogrammed it so that all bonus spells ALWAYS go to the top of spell lists for both human and computer players. NOW FIXED. They also want a "keep spell selection hidden" mode. "Hidden Spell Selection"? Won't fit on the lores setup screen . :( There is no need to have this as an option. It can simply always be on. 1. Put up a screen when you end your turn and ask for the next player to press a button to continue. What should this screen be? A simple printed screen? Or a 640x512x16 color IFF? Or a 320x512 HAM6 IFF? or ??? Or a 320x512 HAM6 anim? * BUG: JJ reports that growths assist in the control of artifacts. Only creatures are supposed to assist in the control of artifacts. NOW FIXED. * FLAW: JJ reports that Biohazard MeltScreen effect lasts toooo long. I have now reduced it from 100 iterations down to 70. NOW FIXED. January 1, 2001: * Added all the musician's names to ChaosDocs.texinfo. January 2, 2001: Added the following default combat sounds for creatures who do not have a defined combat sound: Swoosh SwooshUgh BigSwooshUgh BigSwooshUuugh! (15 combat hit against creature) SwooshThud (These are used for attacking inanimates) BigSwooshThud SwooshOnMetal (These are used for attacking Robot or Dalek) BigSwooshOnMetal BigSwoosh (All BigSwoosh sounds are used for combat>=12) All 9 of the above sound samples combined together = only 42k! BigSwooshUgh is used thusly: volume=64 for 14 combat volume=60 for 13 combat volume=56 for 12 combat SwooshUgh is used for any combat hit 6-11. Volume is always 52 for this one. 6-11 = SwooshUgh Swoosh v=28 for 0 combat v=32 for 1 combat v=36 for 2 combat v=40 for 3 combat v=44 for 4 combat v=48 for 5 combat samplespeed = 8363 for all above samples. For now attacking a growth will play either "Swoosh" or "BigSwoosh" with no ughs. When I find a suitable squishy sound I can change this to SwooshSquish and BigSwooshSquish. In order to implement the above sounds I had to change CellEffect() to take an extra paremeter for the volume. Then I had to spend a whole hour changing hundreds of occurrences of CellEffect() to have the extra parameter added. After I did this I once again got the dreaded >32768 error on cast.c: SLINK WITH temp_smk.tmp Slink - Version 6.58 Copyright (c) 1988-1995 SAS Institute, Inc. All Rights Reserved. Error 502: _sprintf symbol - Distance for Reloc16 > 32768 First Reference in Unit cast.c at offset 00003a56 in file 'cast.o' To Unit sprintf.c at offset 00001690 in file 'LIB:scm.lib' Caused by line 1942 in file cast.c So I syphoned out all the Intelligent Tree casting code into a new IntelligentTreeCast.c file. Now it links ok. I just played a test game and Chaos mysteriously started generating infinite enforcer hits. After a few minutes of this I finally reset the machine. AFAIK this was caused by editing sound samples in OMSSP. Editing samples in OMSSP sometimes crashes the machine directly. * BUG: I've been noticing the computer controlled creatures are playing really stupidly even though I have Ruthlessness turned on. When I created the gadget for Ruthlessness I forgot to connect the Ruthlessness variable to it! So Ruthlessness mode has not actually been working for the last week. NOW FIXED. * BUG: Mod.ChaosTheme18 starts out ok but then it starts playing too slowly after a while. I have now converted it to MED MMD1 so now it works correctly. NOW FIXED. January 5th, 2001: * BUG: This line of code was in the Growth() routine and was executed outside of any semaphore lock on the board! A big no no! ip->char_stat = InitialData(ip->id); NOW FIXED. * FLAW: The last generator that generated something is still highlighted all throughout the Growth() phase. NOW FIXED. * FLAW: The last Agent/generator that casted/generated something still has text left over at the bottom of the screen during the Growth() phase. NOW FIXED. * NEW GFX FEATURE: I have now added code to keep animations of Green Ooze, Orange Jellies and Earthquakes synchronized so they look much better now. This code executes at the end of the Growth() function. Tested and works perfectly. * I Played against 7 enemy wizards who were all in an alliance against me. I won on turn 33. Midway through the game one of them cast Alliance on me. One of my allied wizards was cloaked and reflected and invulnerable and another of them was invulnerable and cloaked. I was playing a game where I kept moving my snake and nothing was uncovered. I then began to wonder how far out my snake was really feeling. So I decided I needed an "f" keypress. * 3 NEW KEYPRESSES: f for "feeling range" h for "hearing range" o for "olfactory range" (o = olfactory = smell) * FLAW: Heal and Vox spells erroneously print a promotion message. NOW FIXED. * Included FD's reflowed and corrected Français spell descriptions. * Reflowed all Magyar Spell Descriptions. * BUG: Computer wizard had 3.5 movement points but moved 3.8 squares to mount his horse! NOW FIXED. * BUG: Grizzly Bear had 2.5 movement points but he moved 2.8 squares to attack me! NOW FIXED. * PROBLEM: the casting beam sound is too loud compared to the sound of the casting twirl effect. This is because all algorythmically generated sfx use a perfectly oscillating square wave. So I have now reduced the volume of algorythmic sounds from 40 down to 32 and now everything sounds better. NOW FIXED. * I drew a new Dark Citadel graphic. * Sent Chaos v3.06 to Xav, FD and SAI on Jan 9, 2001. Executable filesize = 381432 January 10th, 2001: * The color cycling of Special Combat on the info panel has always been unsatisfactory and crappy looking. Now I see why I put off fixing this for so long. It just took me 2 hours to get it all working correctly. NOW FIXED. * Mod.ChaosTheme60 was playing much to slowly so I converted it to MED format. DONE. * Played a test game using the default settings. I won on turn 23. I could have won on turn 22 but I made a small tactical mistake. January 11th, 2001: * BUG: When creatures are promoted they lose their exophagy and scavenging powerups! NOW FIXED. * I finally added a (lame) chainsaw sound for the chainsaw. We can now easily add new "weapon spells" that cause a certain sound to be played during combat. Someone needs to take a chainsaw out and cut some wood with it and record it. Especially the sound of it getting jammed up in the wood. * Must modify promotion() to keep the new .WeaponSoundStat intact. DONE. * Being attacked with a chainsaw is a very painful experience. * I went crazy and played 3 complete test games just so I could hear creatures scream while I chainsawed them. MUAHAHAHAHAHAHA!!! January 13th, 2001: I started getting sick. I drank tons of orange juice and ate a large bowl of Raisin Bran cereal. My brain feels ok now but my throat is still bothering me :( * PARAGRAPH BREAKS are now supported in the spell descriptions! Now we don't have to have long run-on super-huge spell descriptions all in 1 giant paragraph. I tested this by editing the descriptions for Points, Devastation, Alliance and Standard Wall. It works great and looks much nicer, especially on Devastation! I suppose someone should go over all the spell descriptions and see if they need paragraph breaks and put them in. I'm really unclear as to where to place paragraph breaks. It often seems like we need one after almost every sentence. Note to FD: I hope this doesn't break any Arexx->AmigaGuide document scripts or anything. January 14th, 2001: Robin writes > i > have an idea for a new spell: what about a 'brain shield' which protects the > wizard against 'brain drain' and perhaps even the Mindflayer? it's so hard > having an enemy with Double and Brain Drain going around and stupidify > wizards to death in a single turn from a rather great distance and without > any chance of blocking. There is a chance of blocking, Brain Drain requires line of sight so you just have to move 1 of your creatures between you and the doubled wizard. Or you can cast walls or trees to protect yourself. Or you can climb into a Magic Castle or Dark Citadel or Shadow City or Magic Wood tree, or you can simply hop on a common horse or unicorn or you can use the mount spell and mount anything at all. So as you can see, there are a few ways to block. :) January 15, 2001: * Robin _finally_ sent in some Deutsch spell-descriptions (A-E). * I sent a COMPLETE English spells archive to Robin and Wolverine today. * I watched 2 movies today: "Pitch Black" and "The Cell". January 16, 2001: * I implemented help screens. They are attached to the help key. These are mainly for newbie neophytes on their very first game. But the "Help/Show me all the keys" option will be useful to everyone all the time. If you press help/What do I do now!?!? then it is context sensitive depending on what phase of the game you are in (spell selection, spell casting or movement). * Included Xav's bugfixed new Generator gfx into the game. * FIXED Golden Dragon description: It said "vain" instead of "vein". * CHANGED: the highlight sprite from #3 to #2 and adjusted the asm code in the vain hope that it will now work in dblpal. * MYSTERIOUS BUG: Every once in a while, after I've been playing the game for a long time and I am running lots of other programs, I will go to save the game and the save game screen will freak out and cause lots of enforcer hits and not print the word "SAVE" along the side of the screen. This has happened several times over the last several months. I finally figured out what it was! The intro had this line of code: IF (UnionFont70) CloseFont(UnionFont70); But then it never set UnionFont70=NULL; ! So on the save game screen when it did this: IF (!UnionFont70) UnionFont70=OpenDiskFont(&ifs1); ... use the UnionFont70 here and wreak havoc by using a font that has already been closed. The reason the bug only happened randomly is that, normally if you close a font it is still there in memory and your pointer will still work, unless you get low on memory or manually force a flush of all unused resources such as typing "avail flush" in the shell. NOW FIXED. * NOTE TO BETATESTERS: I used the following secret technique to help me find the above bug, it should prove useful in the future when testing this software or other software by other people: 1. Lets say you have a mysterious random bug. 2. Do the thing that triggers the bug as the first thing you do when you load the program. 3. When you see that the bug doesn't happen, go to the shell and type avail flush. 4. Go do the thing that triggers the bug. If the bug now happens then you'll know what the problem is! Using a pointer to a freed resource! January 17, 2001: * Included Xav's new Wood Elf and Dread Elf into the game. * I replaced wizard graphic #3 with Xav's Club Juggler, at least until we go to 32x32 256 color tiles. Joe's friend David moved in. January 21, 2001: Robin reports some flaws in the spell descriptions: * Meddle (change than->the), > 3. exorcise - following situation: there is NO undead > creature on the board. there is NO Browser or Omnipotent on the board. I > resurrect a Green Dragon, in the same turn the computer exorcises it. how > can that be?! is your AI that good that the computer chooses spells even > because of possibilities? what had he done if I had chosen another spell? Send me the autosave where this happened. (of the turn right after and right _before_ it happened). What you are describing is almost impossible. Which means it is finitely probable and in fact _will_ occur someday, sometime, somehow. 1. There was probably an undead somewhere when he chose the spell (perhaps it got killed by something else before he got to cast it though). 2. If there really was NO UNDEAD anywhere on the board when he chose his spell then its probably a bug. 3. But maybe what happened was that he was totally surrounded by stuff so he could cast no creatures. Now suppose his spell list was ALL CREATURES (which he cannot cast because he is surrounded) + he has an Exorcise spell. In such a case, he might choose Exorcise. 4. Or maybe he was under the influence of that spell that prevents you from casting creatures. And suppose he only had 10 spells left on his list and he had 9 creatures + 1 Exorcise. He would then HAVE to choose Exorcise because it would be the only spell available to him on that turn. 5. Or maybe he was surrounded by friendly creatures and friendly trees so that he couldn't cast any of his creatures. Now lets say he has 2 Brain Drains (your fave spell :), 2 Lightning Bolts, 2 FireBalls, 2 Ice Breaths, 2 Magic Attacks and 2 Exorcise spells. In this situation he _can't_ cast his creatures and he doesn't _want_ to cast any of his magical attack spells because the only legal targets are his own creatures. So he chooses Exorcise. 6. There was probably an undead creature or undead wizard somewhere on the board that you just forgot about. It was probably created by Raise Dead or Lich. So the most likely scenario goes like this: 1. Your enemy wizard sees an enemy undead Harpy somewhere that he is going to Exorcise so he chooses Exorcise. 2. You suddenly cast Raise Dead on a ferocious Green Dragon. 3. This scares the computer player so badly that he has to reevaluate what he is going to cast his Exorcise on. 5. After thinking long and hard about this (.001 milliseconds) he decides that your new Undead Green Dragon of Death is far more dangerous than the undead Harpy. So he sends your dragon straight to hell. BTW: when I play games against JJ in real life, he is _always_ wizard #8 and he ALWAYS nukes my dragons/demons/etc with a Justice/DarkPower/Vengeance/Exorcise/etc. _immediately_ on the same turn I cast it. He _always_ watches what spell I choose. The only way I can get away with casting a powerful creature is to wait for the phone to ring or something then cast while he's away. * Did a test: Change languages then Avail Flush then access every screen in the game to see if it still works. Everything seems to work perfectly. January 22, 2001: * Included Xav's new Dire Wolf and Arctic Wolf into the game. They are very blurry but oh well... I'll be glad when we make a hires version. * Included Xav's new Gray Elf. He's a bit tall for an Elf but oh well.. * Chaos needs a website! But there is no point in having a website without screenshots! But everyone on Team Chaos says the same thing "I don't know how to make a screenshot of Chaos". Well I can't wait any longer for someone to figure this stuff out sooo.... * Spent some hours investigating all the screengrabbers on Aminet. NONE of them claimed to work with a multiscreen view so I didn't dl any of them. The one grabber that I TRIED to download, I couldn't because my ISP sux SO BADLY that it would dl at 60 cps for 15 mins and then just abort. :( ScreenGrabbers: "" = It doesn't say it handles multiscreen views. gfx/misc/MasterGrabber.lha It doesn't say it handles mulitscreens and it requires bgui.library. Did not dl it. gfx/misc/Screen2IFF It doesn't say it handles multiscreens so I didn't dl it. Hey!!! Its made by Frédéric Delacroix!!!!!! Note to author: you forgot to add multiscreen support :) gfx/misc/ScreenGrab.lha Doesn't say it handles multiscreens. ScreenJaeger: "" ScreenMugShot: "" but can also grab windows. SGXS: "" ShScrIFF: "" QuickGrab1_1.lha "" ScreenGrab.lha "" Slurp10.lha "" uses joystick button gfx/show/AdEd.lha "" util/misc/SGrabber.lha "" util/misc/wgrab.lha "" util/misc/ShootTheScreen.lha makes a series of screenshots. urann@polbox.com only 5 weeks old. util/wb/sgrab.lha 0 weeks old. * DL'ed UAE + Kick31.rom + an 8 meg hardfile and installed them onto my brother's 650Mhz Athlon 128 megs + GeForce gfx card 32 megs I then put Chaos 3.0 onto it. 1. It cruises at about the speed of a 14 Mhz 020 some of the time. 2. A few times each turn it just STOPPED for a couple of seconds. 3. Sometimes it stops for 10 or 20 or 30 seconds. 1 time it stopped for 45 full seconds!!! What is it doing??!? 4. The mouse pointer moves much more sluggishly and jerkily than an A500. 5. The mods of v3.0 played mostly ok. There was a little "fuzziness" and "distortion" but overall the mods played ok EXCEPT for mod.ChaosTheme1 which always went TOTALLY BERZERK! 6. I said it "cruises" at about 14Mhz 020 speed. Many times it randomly drops into slow-motion mode. Like when you click on a creature, sometimes you'll move it before it makes the "beep" sound. 7. The sprite lags behind the creatures a lot. This is slower than A500 with 7Mhz 68000. 8. The autosaving is unbearably slooooooow..... 9. The soundsamples sometimes played ok, other times they fuzzed out, other times they went TOTALLY BERZERK. 10. The screen scrolling was MUCH slower than a 7Mhz 68000 Amiga 500! The scrolling looks horrible on UAE! 11. All in all it wasn't any fun due to how looooong it took the computer to do its turn. 12. I made some screenshots and worked out how to convert them from superhuge .bmp format to supersmall .jpg format using the software on his computer. 13. Aaaargh! The New Game and Quit Game requesters are HORRENDOUSLY slower than a naked A500! January 23, 2001: * Xav made a new super-cool 42-frame animation of a worm. This crashes the game. Its all because I forgot to add in the code to go from the first row down to the 2nd row and etc. NOW FIXED. * Sent Xav a new updated executable v3.07 + sounds/chainsaw + gfx/spells/Wizard 3 + catalogs/#? + help/#? Executable filesize = 385464. January 24, 2001: Spent all day sending Robin+Artur updated versions. January 25, 2001: Included Xav's hilarious new Amphisbaena animation! * STUPID: When playing with artifacts, computer wizards frequently cast Alliance on artifacts belonging to NOBODY. NOW FIXED. * STUPID: Sometimes computer players cast alliance onto people who are already on their team! NOW FIXED. * STUPID: When playing a game 1 human vs 7 enemy wizards who are all on the same team against the human, eventually 1 of the wizards will cast Alliance onto the human then EVERYBODY is on the same team! NOW FIXED. * STUPID: Computer players refuse to ever cast a double or triple alliance spell. NOW FIXED. * STUPID: Sega gave up on the Dreamcast :( UNFIXABLE. January 26th, 2001: * Hacked and slashed Attila the Hun's labyrinth generation algorithm into Chaos and tested it about 40 times. It worked perfectly every time! Only playtesting will reveal if this new option will be any fun or not. Hopefully it will at least be an interesting diversion to try out from time to time. * Added code to properly put together Power Walls. What should this new option be called? I was originally going to call it Maze Wars but it isn't exactly a maze. More of a dungeon. Here are some ideas for naming this option: Maze Wars Maze Fight Dungeon Dungeon Wars Dungeon Fight ??? * Added code for secondary and tertiary constructs. Ok, now that there is Dungeon Wars mode I figure I should play a test game to see if its any fun. :) I am playing with 1 enemy wizard, 16 generators, no scrolls, no artifacts, Texas Trash'em, Ruthlessness, Dungeon Wars, 99 spells, no turn limit. Exploration mode is off. The generated dungeon was composed of Shadow Wood trees. This means that as the game progressed the independents were fairly proficient at mowing them all down since Shadow Woods only have 22 life points. Turn 1: Aaaaugh! I'm in the middle of the board! I immediately cast my Magic Carpet and hopped on and flew toward the safest corner. I took heavy damage before I could get to a safe spot from all the generated long-distance flying creatures! Some turns later... The enemy wizard has cast a Shambling Mound. It kills a creature almost every turn. It heals about 13 points per turn (+9 for scavenging and +4 during its attack with exophagy). But it is taking about 22 points of incoming damage each turn. His Shambling Mound kept advancing toward the front lines, killing things and taking tons of damage. It was getting pretty weak but then he turned it around and started heading away from the hittable area of all the flying creatures. This allowed him to heal up to maximum within a few turns. His Shambling Mound completely devoured several corpses. It finally died after a Blue Dragon was generated nearby, After he lost his Shambling Mound, he lost all his other creatures and his wizard. :( Oh great! Now everything that had been fighting the computer wizard is charging down towards me! Auugh! Oh well... no problem. My Grey Elf Batallion is right behind a solid wall of Shadow Wood trees. My 3 harpies weaken everything down then my 3 Grey Elves kill them. So I'm 100% safe. Turn 22: I've only killed 3 of the 16 generators. The computer wizard died a long long time ago. My wizard is in no danger of being killed, I have a nice safe corner that I control. However it will be a long and slow process to kill another generator because when I killed the last generator all the flying creatures swarmed in on me and killed my Floating Eye and my Speed Harpy (my 2 best creatures). The only reason I'm doing as well as I am is that I got a triple spell several turns ago and cast Triple Magic Sword, Wraith, Zombie, Harpy, Grey Elf. Now for my bonus spell on Turn 22 I can choose 1 of the following: Elf Boots, Skeleton, Recover Boost or Mass Morph! I'm choosing Mass Morph! Wahoo!!!!! Now I can win the game quickly and get back to coding new stuff! On turn 35 I had killed all the generators except for 5 which were blocked. But I didn't win because there are a bazillion pieces of independent Magic Woods laying around from the Mass Morph. I guess I should change the victory conditions so that enemy inanimate objects do not need to be killed to win. Is that ok? What is your opinion of this? * Added DungeonWars to the savegamefile io.c and to the prefs.c * Added the Dungeon Wars gadget to the setupscreen 2. January 28th, 2001: * Made 126 tiles for the upcoming Tower. * Made 72 ID's for the upcoming Tower. January 31st, 2001: * BUG: When a creature with a Telescope is promoted, it loses its Telescope. NOW FIXED. * BUG: Any creature which is given any enhanced sight, smell, hearing or feeling will lose those enhancements when promoted. NOW FIXED. * Edited the website a bunch. Feb 1st, 2001: FD Writes: > BTW, I think Chaos does not correctly handle saved games with a space in > the name. Probably quotes missing in the lha command line. NOW FIXED. * Included Wolverine's new Magyar.catalog. The mac can't lha things or unlha them correctly so here is the zip command: zip -R DestinationFile.zip * I lha'ed and Zip'ed the Chaos website. The lha archive was smaller. Bad News: My brother went to the hospital so I started to copy the latest version of the game over to the PC using floppies as you suggested. The game fit onto 6 720k floppies (no music). Nice and easy you say? Oh no! The stupid damn PC floppy drive kept randomly screwing up!!! Sometimes it would copy the file, sometimes it wouldn't. I only got files 2,3 & 4 to copy. After hours of trying I gave up and decided to email the files to myself. It takes 10 mins to email 1 file. Just as it was almost finished, my brother came home! 3.5 hours wasted trying to copy the game onto the PC! Arrrgh! So now I must wait until Friday when he will allegedly go to work all day. DL the files from my yahoo mail (5 mins). Join them (5 mins). Unlha them on UAE, (1 hour). Then I can load all the levels and make the screenshots. Good News: My brother is cured. But he is still recovering. Feb 2, 2001: -------------------------- Setup Problems ----------------------------- * FLAW: Every time you start a game the 1st dungeon is the same as the 1st dungeon of the last time you loaded the game. 2nd is the same as the 2nd, etc. rnd_seek is now loaded from IntuitionBase->Micros so this is NOW FIXED. * FLAW: If you play Dungeon Wars mode with 99 generators, the board is pretty much solid on turn 1 with _many_ generators blocked off. NOW FIXED. * BUG: If you start a game with 99 Generators and 99 scrolls and 99 artifacts The game gets stuck in an infinite loop. NOW FIXED. * Allow generators to be placed on empty squares OR in place of inanimate objects OR on top of dead bodies OR on top of scrolls. DONE. * Allow scrolls to be placed under generators, under the dungeon pieces or in empty spaces or on top of dead bodies. DONE. * Allow artifacts to be placed on top of scrolls, on top of dead bodies or into empty squares. DONE. * BUG: If you play with Dungeon Wars + 99 generators + 99 artifacts then the game still gets stuck in an infinite loop because there isn't enough room to place all the artifacts. NOW FIXED. TESTED and works perfectly! ---------------------- END Setup Problems -------------------------- I just played a test game of 99 generators + 99 scrolls + 99 artifacts + 1 enemy wizard + Ruthlessness + Texas Trash'em + Dunegon Wars. It took me quite a few hours to finally win. After a while I got an Aesculapius and started pumping up all my guys. Then I started killing tons of generators and walls. On a typical turn I would get to choose 3 spells from a list of several. I got the Mass Morph spell offered to me on my bonus spell selection screen MANY MANY times! It was offered to me twice in 1 selection 1 time! It was offered to me around a dozen times during the game. This is very weird. It never once offered me what I really needed: a Fly spell or an Archery spell or a Wizard Wings spell or a Recover Boost or a Lich. * Problem: I can't stand the way Standard Walls look on the Dungeon Wars maps. The color between the bricks looks very bad IMHO. It should either be a _very_ dark red or black. NOW FIXED. * Problem: I can't stand the way Weak Walls look either. The color between the bricks should be either a _very_ dark yellow or black. NOW FIXED. * Problem: The Hwall and Vwall pieces of Power Walls don't look so good when they are the last piece on the end and not connected to anything. NOW FIXED. Aaaaah now the gfx seem much more appealing to me. :) * PROBLEM: Lha 2.1 is buggy and crashes the machine, which is why I use lha 1.35. However, users with lha 2.1 seem to have an lhaopts file which uses parameters that don't work on lha 1.35. This causes game saving and loading to not work. So I have now hacked lha 1.35 to NOT try to read the lhaopts file. NOW FIXED. Feb. 3, 2001: * The translation of "Magic Resistance" in the Magyar.catalog is "Mágia ellenállóképesség" which is wayyy tooooo long to fit on the info panel. I am shortening it down to Mágia Ellenállás. * Manőverezhetőség is also toooo long. I am shortening it to Manőver. * Generated the IP1 screen for Magyar finally. * Put Ruthlessness and Dungeon Wars into the ChaosDocs.texinfo then sent it to FD. Feb. 4, 2001: * Made the first couple of screenshots of Chaos. Feb. 5, 2001: * Spent all day wandering around the net on DSL + writing Emails + reading newsgroups. * I DL'ed and played 3 games from Aminet. 1 was somewhat interesting (very creative). The other 2 pretty much sucked. :( * Included Robin's new OPQ Deutsch descriptions. Feb. 6, 2001: * NEW GFX: Included Xav's great new Optometron of Omniscience and Exit gfx! * I updated HelpWanted.html, installation.html, requirements.html, legal.html, features.html, chaos.html and index.html, HelpWanted.html a bit. * Robin and Xav and Artur are all reporting serious Email service problems and disruption. Feb. 7, 2001: * I loaded up some 1990 and 1991 commerical platform games to study the graphical fx. I learned some nice stuff. :) Feb. 8, 2001: * STUPID: If you shoot your allied wizard repeatedly he won't cast his Separation spell if he has one. NOW FIXED. Above fix meant I had to change the gamesave format so I went ahead and added in the the 2 WORDs for the 5 leather armors and 5 chainmails spells + added in some unused LONGs while I was at it. DONE. Make a new LONG in the Wizards[] struct that contains the value of the desire to cast Separation. .SeparationDesire. DONE. Modify the ranged combat routine to add points to this LONG every time an ally shoots one of his creatures with normal combat. Subtract off healing combat. DONE. Any positive hit on a wizard or a wizard's mount sets it to max(.SeprationDesire,100); DONE. ALL DONE. * You can shoot an allied wizard who has a reflector and it won't make him mad. * You can shoot an allied wizard or any allied creation with 0 or negative combat and it won't make him mad. In fact, shooting your allies with healing combat will make them like you more. * Tested and works perfectly! END OF V3.1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Made a copy of everything into sc:Chaos_3.2/ BEGIN V3.2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Feb. 9, 2001: * Implemented Towers. Tower* Lo, I beheld a great vision, as it were, of a Tower. And the Tower was small. And the hand of God came down from Heaven and the essence of man was placed therein so that all who dwelled in the Tower would work together to achieve a mighty greatness. Inscribed upon the face of the Tower were these words: "He who entereth shall not leaveth and no wizard shall ever enter." Many humble peasants saw the tower and spake amongst themselves, "We are weak but the Tower is strong, let us enter into it that we might strike great fear into the hearts of our enemies". And it came to pass that the Tower gained the strength of strong men, the wisdom of wise men, the constitution of hearty men, and the skill of the greatest archer. The limit of its power is not yet known. Tower* The mystical powers of the Magic Tower allow it to absorb the essence of any creature who enters it. The Tower starts out very short but as it becomes more powerful it grows in size. Any creature entering a tower adds all of its primary statistcs to the statistics of the Tower. Once a creature enters a tower it can never leave because its essence becomes one with the tower in a permanent and unbreakable bond. Wizards cannot enter towers. Height = Life that way it can grow and shrink according to how damaged it is. Blue flag = archery. Red flag = attacks undead. Red doorway indicates scavenging. For 9 levels of height there will be 9 * 2 = 18 frames of animation for a tower with 1 flag. 18 frames for a tower with Red Flag. 18 more frames for a tower with Blue Flag. 18 more frames for a tower with both flags. 18 more frames for a tower with scavenging (red doorway) + Red flag. 18 more frames for a tower with scavenging and the Blue flag 18 more frames for a tower with scavenging and both flags. 9 single frames for a plain tower with no flags and no animation. 9 single frames for a plain tower with no flags but with scavenging. 126 frames for 1 object!!! 126 frames if I use 9 height levels of 7 each! 9 Height levels corresponding to 7 points of life each. 0-7 = lowest level. (no trunk) 8-14 = 1 pixel of height. 15-21 = 2 pixels of height. 22-28 = 3 pixels of height. 29-35 = 4 pixels of height. (starting height). 36-42 = 5 pixels of height. 43-49 = 6 pixels of height. 50-56 = 7 pixels of height. 57-63 = 8 pixels of height. TowerLevel1ID "Tower Level 1" TowerLevel2ID TowerLevel3ID TowerLevel4ID TowerLevel5ID "Tower Level 5" (The real beginning one) TowerLevel6ID TowerLevel7ID TowerLevel8ID TowerLevel9ID TowerLevel1UID "Tower Level 1 U" TowerLevel2UID TowerLevel3UID TowerLevel4UID TowerLevel5UID TowerLevel6UID TowerLevel7UID TowerLevel8UID TowerLevel9UID TowerLevel1SID "Tower Level 1 S" TowerLevel2SID TowerLevel3SID TowerLevel4SID TowerLevel5SID TowerLevel6SID TowerLevel7SID TowerLevel8SID TowerLevel9SID TowerLevel1AID "Tower Level 1 A" TowerLevel2AID TowerLevel3AID TowerLevel4AID TowerLevel5AID TowerLevel6AID TowerLevel7AID TowerLevel8AID TowerLevel9AID TowerLevel1UAID "Tower Level 1 UA" TowerLevel2UAID TowerLevel3UAID TowerLevel4UAID TowerLevel5UAID TowerLevel6UAID TowerLevel7UAID TowerLevel8UAID TowerLevel9UAID TowerLevel1SAID "Tower Level 1 SA" TowerLevel2SAID TowerLevel3SAID TowerLevel4SAID TowerLevel5SAID TowerLevel6SAID TowerLevel7SAID TowerLevel8SAID TowerLevel9SAID TowerLevel1USID "Tower Level 1 US" TowerLevel2USID TowerLevel3USID TowerLevel4USID TowerLevel5USID TowerLevel6USID TowerLevel7USID TowerLevel8USID TowerLevel9USID TowerLevel1USAID "Tower Level 1 USA" TowerLevel2USAID TowerLevel3USAID TowerLevel4USAID TowerLevel5USAID TowerLevel6USAID TowerLevel7USAID TowerLevel8USAID TowerLevel9USAID 1. Save out 72 different gfx files, correctly arranged and with the correct name. DONE. 2. Save out 72 different spell files. Correctly set up for the new tower object. DONE. 3. Save out 72 different spell description files? I dunno. I think we only need the description for Tower Level 5. You can't ever read any of the others. Hopefully that will work. 1 description saved. DONE. 4. Write code to check all objects on board if they are a tower and set them to the correct id based on their life value. DONE. 5. Above routine is _always_ called at the end of casting any spell, at the end of the combat routine and the end of the ranged combat routine. DONE. 6. Figure out how to generally handle "damagable" objects! There is no way to "generally" handle them (that I can think of) because the anims might be changed based on movement points or life or any other stat. 7. Put in the code to the movement routines ala pit and shadow wood and bolter. A. Any move into a tower by a creature (tower and creature are owned by the same person) results in the creature entering the tower ala pit. DONE. B. An engaged person can sneakily escape into a Tower! DONE. C. Any move into a tower by a creature (tower and creature are NOT owned by the same person is going to be handled JUST LIKE USUAL, its just a plain normal attack. DONE. D. If you click on a Tower, handle it just like a Shadow Wood. DONE. 8. We could have a special little sound to play for when a creature enters a tower but I have no idea what it should be. Any ideas? * Played a couple of test games with Towers. Everything seems to work ok. ====================== END TOWERS UPGRADE =============================== Feb. 10, 2001: * STUPID: Computer wizards sometimes cast Cartagraphy, Telescope, Seismology and Alternography when the game is not even in exploration mode! NOW FIXED. On 07-Feb-01, Sean A. Irvine wrote: > I had a quick game of Chaos last night. The only stupid thing I > noticed was when my own Mullac de Irvine decided to cast an > earthquake right next to my wizard. Naturally, I gave the Mullac > a war[n/m]ing blast from my dragon and he didn't do it again. Hehehe. Ok I have now adjusted the AI so that computer-controlled spellcasters will not cast Earthquakes adjacent to friendly wizards. Unless the friendly wizard has an Earthquake shield, then they might cast it there anyway. NOW FIXED. * DITTO for Floods and Fires. * Included Robin's new Power Wall description into the game. * Activated the Chaos website and uploaded all the files. It works ok but all the fonts seem too small. * BUG: An allied computer wizard might still cast Earthquake adjacent to one of his allied wizards if he is meditating in an enemy meditation. The trouble is that SameTeam() gets confused when Wizards are inside of enemy objects. NOW FIXED. Feb. 11, 2001: * ADDED: Special Combat now plays the creature's special attack sound from Sounds/Combat/ just like regular combat does. This was needed for Wasp Nest and Grim Reaper. * NEW CREATURE: Grim Reaper. Stats, animation, sound and description designed by Robin! I put this one in first since he did the whole package himself which freed my mind to concentrate on coding. I tested the new creature and he seems to work ok. He's very tricky to use, especially in Dungeon Wars mode. * Added sound effects for Wasp Nest and Grim Reaper to the Sounds/Combat/ dir. * BUG: There was no WaitJCsound() in the CellEffectList() routine so the long sound effects of 1 special combat thing could overlap into the special combat of another thing. NOW FIXED. * 2 new wizard names: When you start the game there are now 2 new possibilities for the random wizard names: Robin Hood in honor of Robin Schmidt. King Artur in honor of Artur Chlebek. * Updated contacts.html some more. Feb. 12, 2001: * 3 NEW SPELLS: Ditzy Blonde, Winged Elf Boots and Anger. ----------------------------------------------------------------- Ditzy Blonde* Range 5 LOS. ComputerAssist: FLAG_SMART IsStupid() don't cast on 3 or lower intelligence. ----------------------------------------------------------- Winged Elf Boots* Winged Elf Boots are manufactured with genuine Pegasus Feathers which bestow the ability of flight upon the wearer as well as increasing movement and maneuverability. CAST_FREE I couldn't decide whether or not: A: To have this spell grant +1 movement points or not. B: To allow this spell to be cast on _anyone_ or only the wizard. ------------------------------------------------- * A new spell: Anger Anger (Probability -40, BONUS spell, CAST_FREE) Anger is a powerful spell which will make all your creatures very angry at their opponents. As a result their combat ability will be raised by 1 point. ------------------------------------------------- * BUG: The Ditzy Blonde sound sample for some UNKNOWN reason had the default volume set to 0! Arrrgh! So it would play silently! NOW FIXED. Any updates I send out will need a new Ditzy Blonde casting sound! Feb. 13, 2001: * 2 NEW SPELLS: Worm and Blood Worm. Feb. 14, 2001: * Included Xav's damagable Weak Wall, Strong Wall and Standard Wall. I implemented the proramming for them and then played a test game. WORKS GREAT! Feb. 15, 2001: * Included Xav's damagable Rock. I smoothed many (all?) of the Rock pieces. Feb. 16, 2001: * EDITED: The Amphisbaena to have the word balloon over his head. * I DREW: 8 additional damaged variations of Power Wall Center, Power Wall Vertical and Power Wall Horizontal. Feb. 17, 2001: * INCLUDED: The new damaged Power Wall variations into the game. Change CWallID -> PowerWallCenter9ID Change VWallID -> PowerWallVertical9ID Change HWallID -> PowerWallHorizontal9ID * BUG: Destroy Wall and Animate spells totally do not work with the new multi-damageable variations of walls system. NOW FIXED. * Artur _finally_ sent in a 50% translation of the game. (He promised it would be done by Jan 2nd, 2001) English.catalog 4237 QuickStartDocs.txt 7380 SpellDescriptions/ C-Z 85025 TOTAL: 96642 bytes (50% = 95529) Combining the 50% translation + his mods = the agreement we made many eons ago. * Spent several hours compiling/testing/archiving/sending Artur his v3.04re version of chaos. * Spent 1 hour investigating why the png gfx of the website work on all amiga webbrowsers and on MSIE but not on linux or netscape mac. Feb. 18, 2001: Experimented with drawing damaged Lions. Feb. 19, 2001: * BUG: I put chainsaw on my ghost and it didn't make the chainsaw noise! (when I attacked a red dragon) Ok right now it is set so that if a creature already has an attack sound then it just keeps playing the normal attack sound when you have a chainsaw. The chainsaw noise is only played on creatures who have no attack sound. Should this be changed? I think the answer is yes. NOW FIXED. * INCLUDED: Xav's new Free and Free All gfx into the game. Robin writes: > Raise Dead: A powerful spell, if wisely used. The comupter, however, > does not use it wisely: I played a game with all 8 wizards in one team, > against 26 generators. there happened some fierce combat and then a wizard > who had the Depth power-up spoke the Raise Dead. But he didn't raise the > Blue Dragon that was lying in front of him, no, he raised that stupid > Fire Bat in some corner of the board?! > How does the computer choose what corpus it raises? Ok I looked into this and it seems to be completely random! I never knew that!?! * STUPID: Raise Dead and Resurrection are cast completely randomly with _no_ AI whatsoever. I have now changed this to make it use the general Dangerousness() algorithm. NOW FIXED. Feb. 20, 2001: * Compiled v3.04d for Aminet. Feb. 21, 2001: * PROBLEM: I will soon be entering in 24 variations of the Lion. But I don't want to have to waste 24 identical dead images of the Lion so I need to implement Groups (of IDs) into the game. NOW FIXED. * Creatures need a Group: tag in the spell file. If this tag is missing then Group = 0. If Group==0 then there's no group. Otherwise Group is the ID to get the dead body information from. This way I don't have to have a jillion identical dead body images for every creature-variation! Group tag added. DONE. * InsertCorpse() and InsertCorpseUnder() must be modified to check for IF (InitialData(id).Group != 0) id=InitialData(id).Group; DONE. * Test out putting in a lion with no dead body and see if the tilecount goes down by 1! BEFORE: tiles 228864 AFTER: tiles 228672 Yeah! It works!!! * Included FD's new SpellsToTexInfo.rexx and his new paragraph fixed English and Français spell descriptions A-D. * I split Readme.txt into 2 seperate files: History1997-1999.txt and History2000.txt. I deleted Readme.txt since it really isn't intended for the general public to read. It is just the history of implemented changes. * BLOOD: Xav says that with the new bloody versions of the creatures the game will become a blood bath and some people may not like that. Therefore we need a Blood on/off feature. DONE. * I put the Blood option on the setupscreen, the gamesave file and the prefs file. DONE. * BUG: The score of the independents is NOT saved with the game!!!! in score.c and io.c change MAX_WIZARDS to ENTITIES While I'm at it I'm going to convert all existing levels to have BloodMode=ON. Reload and resave ALL the levels using the new routine. NOW FIXED. Feb. 22, 2001: * Included FD's new ChaosDocs.texinfo fully updated for V3.1 of Chaos. Feb. 23, 2001: * Included the new setup screens including the new Blood option for English, Français and Deutsch. * Included FD's new Paragraphized English and Français spell descriptions A-Z. * Included FD's new scripts/ dir for making documentation related files. * Included Krzynio's Polski ChaosLite.readme and Valwit's Deutsch ChaosLite.readme into the aminet v3.04 version. Feb. 24, 2001: * Uploaded v3.04 to Aminet with a readme in all 5 languages. The Rosetta Stone of .readmes. :) The purpose of this version is to have a 100% version sitting on Aminet during the months that it takes me to prepare the next MEGA release of Chaos. Archive size is: 5933797 bytes. Feb. 25, 2001: * 12:01 a.m. I saw the new ChaosLite.lha (v3.04) materialize onto Aminet. * 8:00 a.m. Updated the website contacts.html and downloads.html from Chaos v3.0 to Chaos v3.04. * Implemented the complete new Lion. 72 tiles + 1 tile for the dead body. Lion Lion d1 Lion d2 Lion d3 Lion 3 legs Lion 3 legs d1 Lion 3 legs d2 Lion 3 legs d3 Lion 0 legs Lion 0 legs d1 Lion 0 legs d2 Lion 0 legs d3 Lion wings Lion wings d1 Lion wings d2 Lion wings d3 Lion 3 legs wings Lion 3 legs wings d1 Lion 3 legs wings d2 Lion 3 legs wings d3 Lion 0 legs wings Lion 0 legs wings d1 Lion 0 legs wings d2 Lion 0 legs wings d3 * PROBLEM: When playing the game in English, the translated spell names are not shown at the bottom of the screen. Only the TRUE name of the creature is shown (such as "Lion wings d1"). This looks tacky. This has never really been correct but it has always been tolerable until now because we have so many jillions of damaged versions of objects. Possible Solutions: A: Make new spell description files for these new object variations and then force the English mode to use these translated names instead of the true names. B: Make the bottom of the screen code and the info panel code display the name of the Group that the object belongs to rather than the exact name of that ID. This sounds like the easiest option since it requires 0 new spell description files to be created, edited and maintained. Ok I just made a simple change to the CreatureName() function so everything that prints the name of a creature in the whole program should now automagically work with this new system. NOW FIXED. * BUG: Ack! Certain names of certain spells are totally wacked out in Français mode! Lion, Faun, Cobra work. Passage, Invulnerability, Vengeance, Justice, Abduction, Raise Dead, X-Ray, Unicorn do not work. Ok I just spent a whole hour investigating this problem. I _finally_ figured out what is going on! This is all because the lists of spell names in SpellDescriptions/#?.txt were not rebuilt after I added in the new spells! These must be rebuilt each time a new spell is added. I'm going to change the makefile to delete them all each time I do a "smake clean" (like it used to do). NOW FIXED. Feb. 26, 2001: * GROUPS: I went back and put all power walls into 1 big group. I also put all other damagable walls and rocks into their own individual groups. This fixes foreign translation problems. FD Writes: > * During special combat, "independents" is still printed at the bottom of > the screen. I just tested this and it didn't say "independents" but it did say "range = 0" at the bottom. NOW FIXED. > * When a creature comes back from the astral plane, during the subsequent > spell selection, the player # key shows it as unmoved. Just a detail. I propose that _all_ creatures should be set to unmoved during the spell selection phase. This has been bothering me for a long time. I always want to check how far a certain creature can move during my spell selection but I never can because they have all been set to "already moved". NOW FIXED. > * My wizard mounted an independent flying carpet (BTW, I was quite surprised > to see such a "creature" to be generated), but I cannot move the carpet. I > can't even dismount. While this is OK for magic wood (but what would happen > if someone casts stone to flesh on the tree I'm meditating in?), this is > quite disturbing for creatures. What is happening now is that the game checks if something is a Meditation. If its a Meditation and its empty then anyone can enter it, even if the meditation is a creature that belongs to someone else. Possible solution: Do not allow wizards to mount CREATURES which belong to the enemy, even if the creature is a meditation. This sounds perfectly sensible to me and this is the way the game has traditionally always worked. Ok I just added in the line of code to prevent human wizards from mounting enemy meditation creatures. But now I am thinking I should have just left it the way it was. It sounds pretty cool that you can mount an enemy magic carpet in an emergency. You should eventually get a bonus spell out of it. But if you have only 1 enemy and you are mounted on his Magic Carpet then you'll be invulnerable because he won't attack his own stuff to get at your wizard. Is this an interesting strategic aspect? Or a bad design flaw? Aaaaaugh! I don't know what to do! I'm leaving the fix in since I already put it there. So the rules currently are: "You cannot mount any enemy creature." "You can mount an enemy inanimate object if it is a meditation object and nobody else is already mounted there." * ADDED the code to prevent computer wizards from mounting enemy creature meditations to many AI routines and movement routines. This took 1 hour. * TEST: Placing one of my Magic Carpets next to an enemy wizard to see if he can sneak mount it. The enemy computer wizard attacked it. PASSED. * TEST: Surrounding an enemy wizard with my Magic Carpets. The wizard could not mount them, he attacked them instead. PASSED. * TEST: Surrounding my allied wizard with my Magic Carpets. The wizard could not mount them nor attack them. PASSED. * TEST: Surrounding an enemy wizard (who has max manoeverability) with my Magic Carpets. This is to make sure he is not engaged. He just attacked one of my Magic Carpets. PASSED. > * My creatures accept to attack this carpet. They should not, since it's > (supposed to) be a hide for me. Its an enemy creature, so of course they accept to attack it. :) If you are mounted in an enemy Dark Citadel and someone casts Stone to Flesh on the Dark Citadel you will then be mounted on an enemy creature and you won't be able to dismount because the game does not allow you to click on enemy CREATURES. You have always been allowed to click on enemy inanimate objects IF you are mounted in them. Possibilities: A: Leave it alone. The Dark Citadel will collapse soon enough and you'll only be trapped for a while. B: Modify the code to allow you to dismount from an enemy creature. C: Allow people to control enemy creatures if their wizard is mounted on them. (This sounds really weird to me.) If we did this then I think _both_ players (the player who owns the creature and the player who is mounted on the creature) would each control the creature in turn. A split-personality psychotic creature. I recall this happening in some games years ago, possibly due to some silly bug. > E. When the wizard somehow mounts an object (be it a creature or inanimate) > that does not belong to him (like a foreign meditation object, or if s.o. > casts stone to flesh on a citadel), then this object is automatically > tranfered under his control (because of the spatial confinment mounting > allows, increasing the concentration of astral & psionic particles) :-) > Just like a 100%-success subversion. When I was going through piles of AI routines and editing them so that computer players will now (allegedly) not "think" that they can mount enemy creature meditations... I was half-tempted to change the rules and allow _ANY_ wizard to mount _ANY_ mountable creature. My idea goes like this: 1. Any wizard can mount any mountable creature. 2. Perhaps allow wizards to dismount anything they are mounted on. Or maybe not. 3. If you are mounted on an enemy creature then you get to control it, but since it is an ENEMY creature your movement might be very limited (you might get engaged to your own real creatures). And you won't be able to attack things owned by the same owner as the mount you are riding. But you nevertheless could still move and attack things belonging to other players. 4. If you are mounted on an enemy creature then the real owner of that creature still gets to control the creature as normal on his turn. So for example you might be about to die, you have NO choice but to mount the enemy Elephant that is about to kill you. (You have previously cast Ride). Suppose the Elephant belongs to player 1 and you are player 8. Each turn Player 1 will move the elephant and kill one of your puny orcs. Then on your turn you charge off in the other direction to kill an enemy creature. I think it would be cool to be mounted on an enemy creature. You never know where he'll take you! You have some control over him. But he has some control over you too! It could be wild! On the other hand it might be stupid, if you have only 1 enemy because he would never attempt to harm his own creature. I didn't attempt to put this idea into the game because: 1. You guys don't seem to like it. 2. There is a good chance that it will cause some secret side-effect bugs that will have to be debugged and I don't feel like working that hard on it right now. 3. Even if no new bugs get created, it will still take some time to think about all the AI routines and movmenet routines and how to modify them to work correctly with the new rule. 4. It might be a totally stupid idea. Perhaps I will put in some #ifdef code some day to test out this idea temporarily, just to see if it works ok, if its any fun or not, etc. * INCLUDED: Xav's new Centaur, Juju Zombie, Pox and really awesome Pegasus gfx! * IMPLEMENTED: the complete new damagable Leopard (24 IDs, 73 tiles) and the new damagable Elephant (24 IDs, 97 tiles). * There are now 3 damagable creatures in the game: Lion, Leopard, Elephant. I guess that is enough until I hear back from people if they like them or don't like them or whatever. Feb. 27, 2001: ======================== SOME ANNOYING BUGS ============================ * ANNOYING BUG: During the movement phase when you are moving your creatures around; when you click on an object to attack it the amount of life left in the object is not updated at the bottom of the screen. In order to force the screen to update you must move the mouse entirely off the current square and then back onto that square. * ANNOYING BUG: When you shoot an object, the life at the bottom is not updated until you move the mouse completely off the square and back onto it. * ANNOYING BUG: When you shoot an undead object and kill it so that the square is now completely empty, the text at the bottom of the screen still says the name of the object that WAS there, not what is _currently_ there! You must move the mouse completely off the square and back onto it again to see what is really there. * ANNOYING BUG: When you kill a growth and the growth dies and reveals a covered creature, the text at the bottom of the screen STILL says you are pointed at the growth! It doesn't update to show what you are REALLY pointing at now. You must move the mouse pointer off the current square and back onto it to get it to update the text. * ALL ANNOYING BUGS NOW FIXED! (I put a Clearoxoy() everywhere there was a RecalculateAllDamagedObjects() + I put one at the end of SayCreatureName()) ========================================================================= * PROBLEM: The Level Editor menus are about to overflow with all these bajillions of damaged object variations. I have now changed it so that damaged variations of objects are not shown in the menus, only the original primary object is shown. NOW FIXED. Arrrgh! Now that I fixed the level editor bugs the game won't link! SLINK WITH temp_smk.tmp Slink - Version 6.58 Copyright (c) 1988-1995 SAS Institute, Inc. All Rights Reserved. Error 502: @MENUSpeech symbol - Distance for Reloc16 > 32768 First Reference in Unit chaos.c at offset 000001ae in file 'chaos.o' To Unit menu.c at offset 00000010 in file 'menu.o' Caused by line 723 in file chaos.c Chaos.o debug=fullflush is 181540 bytes. That seems to be about the limit before this retarded >32768 bug starts happening. :( * ADDED: code=far to the compilation of chaos.c. Now Chaos.o is 182564 bytes and the game compiles and links perfectly now! * I improved the gfx for Uncertainty, Inanimorphobiosis and Mass Petrification. Feb. 28, 2001: * I had to go back through all 72 Tower spell files and add in a line Group: TowerLevel5ID to each one. This should hopefully solve all on-screen translation problems. * BUG: Magic Carpets NEVER collapse! I had just assumed there was code in BoardUpdate() to go through and check all meditations and randomly collapse them. But in fact, each object must be hardcoded in to be checked for. I will rewrite it later. For now I added MagicCarpetID to the list of things to check for. NOW FIXED. * BUG: Damaged objects don't make their attack sounds, death sounds or kill sounds! NOW FIXED. * I Changed the combat, death and kill sounds determination code to play the sound associated with that SPECIFIC ID. If it doesn't have one then it checks if this thing is in a group and if it is then it uses the sound from the Groupid (if the Groupid has a sound). This allows super maximum flexibility because now a Winged Lion could have a different kill, death or combat sound than the regular Lion. There is no immediate need for this but the need will arise in the future. On 28-Feb-01, Robin Schmidt wrote: > I've got some strange tales to tell. Sit down and listen, my friend... > > 1. There once was an Emerald Dragon. It was strong and proud and it got the > ability to reincarnate. Wenn it destroyed the Weak Wall of an enemy wizard > with a mighty blow of its claws and a blast of fire, it perished itself due > to the Eye For An Eye spell of that enemy wizard. But lo! it reincarnated > and returned as a fresh Green Dragon, and at once, within the same turn, it > attacked its enemy with claw and breeth again! A mighty ally, isn't it? Yes indeed. > 2. There once was a T-Rex who came along to fight against me. I stopped it > with some undeads and shot a Toxity Beam at it. Its magical resistance > dropped him dead within three turns, but I wondered how it could continue > fighting with its full strength of 15, though it ought to loose one point > per turn? > > Strange things, my friend, strange things... Thank you for reporting this bug! I just spent a whole hour fixing it. * BUG! Manoeverability, combat, ranged combat and special combat recovery don't work right! Example: if some thing with max manoeverability and max combat gets hit with toxicity beam then his combat and manoever stats NEVER DECREASE! Even though all his recovery rates are at -1! NOW FIXED. * Included Xav's new Derro, Eagle, Faun and Hybsil. March 1, 2001: I woke up and my throat was completely dry and hurting and my head feels bad. I'm getting sick again! :( * STUPID: Computer wizards sit next to 4 Dark Woods, taking 8 points of damage each turn, even though there are MANY safe squares that the wizard could move to! NOW FIXED. * TESTED: Played some test games. The Wizards seem to move ok. If you notice computer wizards moving in a completely stupid manner then please let me know and send me the before and after autosaves please! * TESTED: I placed Nuked squares and powerful creatures on 1 side of a wizard and Nuked squares with MANY Shadow Cities just beyond in an attempt to trick the wizard into moving himself into the Nuked square and dying. He did not move into the Nuked squared. PASSED. * TESTED: As above but with pits. PASSED. * I got my Commodore 1960 Multisync monitor up and running on the A3000, A1200 and PC. It can scan up to at least 37.9 Khz even though the instruction manual says 35.5Khz. Of course it scans down to 15.75 Khz. It can do at least 800x600 noninterlaced @ 60 Hz. It can do at least 1024x768 interlaced. * I drank lots of mineral water. I feel somewhat better now. March 2, 2001: * I designed the numbers 0-30 in a nice smoothed out manner using a 6 point font. I made red and green versions. This is for use in the new CellEffects. * I took Xav's new Attack CellEffect made 31 versions of it (0-30) using red numbers. This will be the new standard Attack cell effect. The 0-30 is to show the damage being done. 30 is the maximum damage that can ever be inflicted by a single hit (max combat + Battle Cry) * I took the old original Attack CellEffect and improved it a little and then made 31 versions of it for use as the new Healing CellEffect. We really need a better animation for this though. Attack (unspecified damage, unused) Attack0 Attack1 Attack2 ... Attack30 Heal (unspecified damage, unused) Heal0 (This is unused also) Heal1 Heal2 Heal3 ... Heal30 We still need some good animations for the following effects: 1. Poisonous attack. (e.g. Giant Rat, Cobra etc.) 2. Healing attack. (e.g. Hippocrates, Pool, Aesculapius, etc.) 3. "Weird" attack. (An attack against a weird statistic like e.g. Intelligence or Maneuverability or something. Mind Flayer, Spectator, etc.) 4. An attack against multiple statistics at once e.g. Arctic Wolf, Iridium Horse, etc. March 3, 2001: * Did the programming to display the new attack and heal fx in the game. This requires rewriting CellEffect() to take YET ANOTHER parameter for the damage (or intensity) of the effect. Most effects will be ignoring this parameter, at least at first. For now only the Attack and Heal effect will make use of the damage (intensity) parameter to display the amount of damage being done during the attack. AAAAAUUUGGGHHH!!! I'm going crazy!!!! There are 58 spell files with a CellEffect() call in them!!! There are around 70 CellEffect() calls in the spell files + lots more in the main program files. Every time I upgrade CellEffect() or other functions I always spend all year loading up each individual spell file and editing it and saving it and its driving me insane. It would be REALLY nice if all the code was in 1 file. I've done a million of these upgrades of various functions and each time its the same old story. Load up a bajillion seperate files, edit them and save them. It would just be sooooo much easier on me to have only a few code files instead of hundreds. What is the solution? Ok I worked out a solution. At least this will work for the time being: flashfind from "" search CellEffect quiethit nohighlight >t:t produces a nice list of filenames like this: GAMES:sc/Chaos_3.2/cast.c GAMES:sc/Chaos_3.2/cell.c GAMES:sc/Chaos_3.2/chaos.c GAMES:sc/Chaos_3.2/core.c GAMES:sc/Chaos_3.2/move.c GAMES:sc/Chaos_3.2/start.c GAMES:sc/Chaos_3.2/warp.c Then I just do some searching and replacing in CED to make it look like: work:ed GAMES:sc/Chaos_3.2/cast.c -sticky work:ed GAMES:sc/Chaos_3.2/cell.c -sticky work:ed GAMES:sc/Chaos_3.2/chaos.c -sticky work:ed GAMES:sc/Chaos_3.2/core.c -sticky work:ed GAMES:sc/Chaos_3.2/move.c -sticky work:ed GAMES:sc/Chaos_3.2/start.c -sticky work:ed GAMES:sc/Chaos_3.2/warp.c -sticky Then I just execute t:t and I just saved TONS of work. (There are 58 more files in the Spells/ dir) Now If I can just get FD to make me a script or something to do all that automatically I'll be set. :) Now I must decide if I actually _want_ to add this new parameter to CellEffect() or if I should just make a new routine called CombatEffect()? On the 1 hand, out of 170 occurrences of CellEffect() calls only a few of them (the ones in the combat routine) need the extra parameter. On the other hand, the other effects _MAY_ need the extra parameter in the future once someone makes more intricate gfx animations for the other fx.... So I guess I'll go ahead and edit all those calls to have the extra parameter. DONE. * BUG: Speech for Blood Worm does not work. NOW FIXED. March 4, 2001: * Played a test game to test the new effects. Seems to work ok. * Made an actualDamage(player,damage) function to tell me the actual damage that will be done, taking into account vodka and battlecry so the ranged combat and special combat routines will know which CellEffect to show. Robin Writes: > But what about Torment and Discard? My computer-allies really > like to cast that on me. Ok, good point! I just now fixed it so that Torment and Discard use the same AI as Coercion. This means they won't cast it if ALL the wizards are on the same team. I don't know what to do about if you and 1 computer guy are in an alliance against several other wizards. > When I had a stunned creature, which couldn't move due to a Basilisk, there > are two undocumented features: 1. The creature CAN actually move. It just > has to kill any enemy it is engaged to and then moves into its square. Absolutely correct. > 2. (never tried it): You can *speed it _up_* using the slow spell > (setting his moves to 1), can't you? Hehehehe, YES! You can do that!!!! I forgot about that! I can see you have become a formidable champion of the ways of Chaos! > And one idea about Power Walls: Let them stay active even when the wizard > dies. They have enough energy to maintain themselfs, don't you think so? That could be an interesting idea. * INCLUDED Robin's new Kurzanleitung v1.2 (he edited Valwit's v1.1) * INCLUDED Robin's new Deutsch spell descriptions A-S. * Robin sent in a very nice 3x3 squares gfx of an explosion! For use by the Goblin Bomb or Hand Grenade or whatever we want! Now I must figure out how to load the thing into the game. Should it be a .iff or a .anim or a .animbrush or ? March 5, 2001: * CURSOR KEYS: There are certain times during the game where I just want to smoothly and easily check the life of a bunch of things in a straight line. There is no easy way to do this with the mouse. I try pressing the cursor keys to move the mouse pointer but nothing happens. Also, in the level editor there are DEFINITELY LOTS of times where I need cursor key control. Like when I am trying to just quickly build a long wall. So I have now programmed the cursor keys to move the mouse pointer exactly 16 pixels in the chosen direction. NOW FIXED. * Zoltan sent in piles of gfx and sounds for use in Chaos: World's Best Strategy Card Game. The only trouble is that I already have hundreds of good unused sounds laying around on my hard drive, but I can't decide what sounds to use for what event.... And the gfx seem to be drawn in about 26x16 pixels for a 640x256 screen so they look very short and fat on a square-pixel Chaos screen of 320x256 or 640x512. Also the gfx are drawn in only 16 colors with 0 antialiasing. However some of the gfx still look really cool. Many of the sounds are great! My mind is going to explode! Aaaaauuuuggghhh!!!! March 6, 2001: I fiddled around with Dpaint 5 and animbrushes. I tried to play an animbrush file using the ShowAnim command in my C: but it crashed. ShowAnim only works with .anim files. But .anim files always seem to take up the entire screen. :( * Xav sent in BAZILLIONS of nice tiles!!!! Lots of walls but no damaged variations. March 7, 2001: Robin Writes: > A creature just attacked the (enemy) Magic Tree his wizard sits on. > Kinda stupid? Ok I have now adjusted the AI code to realize that attacking an ENEMY unit with a FRIENDLY wizard mounted on it is stupid. This includes attacking with combat or ranged combat. NOW FIXED. * STUPID: Computer creatures will heal friendly units (such as Magic Trees and Castles) which have ENEMY wizards inside them! This includes healing with combat and ranged combat. NOW FIXED. Fiddled around with Dpaint and morphing and explosions. For some reason when I morph my brushes I get excellent graphical results but they are all out of alignment! And I don't know how to realign them perfectly! March 8, 2001: * BUG: PlayNextThemeSong() is blindly opening and reading and writing files with no error checking! This causes the game to crash when run from a write-protected media. Most CD's are write-protected. :) NOW FIXED. * BUG: UpdateTimeSpentPlayingChaos() terminates the game as soon as it fails to write to the update file. Which means it will always terminate the game when run from CD. NOW FIXED. * BUGs: Various pieces of code in start.c call TerminateChaos() as soon as any disk write operation fails. So the game will just quit and not start from CD. NOW FIXED. Ok, now the game runs from CD but there are various annoyances: 1. A requester pops up twice each turn saying "Volume CD0: is write-protected" "Retry/Cancel". (Once for PlayNextThemeSong() and once for UpdateTimeSpentPlayingChaos()). 2. The game now tries to rebuild the indexes of all the thousands of translation and graphic and sound files EACH and EVERY time you load the game from CD. This makes a huge delay every time you load the game. SOLUTION: Make PlayNextThemeSong() check for write-protectedness of the disk and set a global variable DiskIsWriteProtected appropriately. Then all the "file-writing" pieces of code can check this and avoid all writes. NOW FIXED. * Chaos can now be played from CD or other write-protected media. March 9, 2001: * UPLOADED v3.04cd to Aminet with the CD-fix and the "special combat against nobody" fix. Investigated various options of getting an AGA Amiga up and running. March 10, 2001: * BUG: I can't get any INACTIVEWINDOW messages! :( I was going to program in "pause mode" to stop the animation whenever you click to another program. This would save millions of CPU cycles. But I never get any IDCMP INACTIVEWINDOW messages! What is going on?!??? Ok, here was the bug: This code has been wrong for years! USHORT class = msg->Class; ULONG code = msg->Code; The correct code is: ULONG class = msg->Class; USHORT code = msg->Code; There were a total of 14 occurrences of the above buggy code scattered throughout the realms of chaos! ALL NOW FIXED! * PAUSE MODE now works perfectly! Anytime you click into some other window of some other program the CHAOSANIM task stops animating the screen. I had thought this would be a good feature years ago but I didn't know how to do it. This can greatly reduce the multitasking cpu load. This feature is dedicated to Robin Schmidt who asked for it. March 11, 2001: I spent all day shopping for Amiga upgrades. Local computer store: $ 99.00 30 Gigs Seagate Ultra DMA/100 hard drive. $115.00 40 Gigs Western Digital /100 hard drive. $ 40.00 32 Megs EDO ram 72-pin SIMM 60 ns Mail order: 40Mhz 040 accellerator $240.00 50Mhz 060 accellerator $430.00 2.5" to 3.5" IDE adapter ????? Total upgrade cost 430+115+40+50(shipping etc.) $635.00 ! I was thinking about how much trouble it was going to be to reinstall all these jillions of megs of software onto the new A1200 hard drive. Then I came up with an idea! Instead of buying a new 30 gig IDE hard drive I will just buy the SCSI module instead and then take the drive out of my A3000 and put it into my A1200 and *poof* everything is instantly installed perfectly! The OS, the compiler, all my utilities and fonts and C: commands and EVERYTHING! I didn't want to have to buy a SCSI controller. But this will save me TONS of time! So it will be worth it. And since I am getting an extra SIMM socket on the SCSI controller I can now buy 2 of these cheap 32 meg SIMMS! New plan: $430 Blizzard 1260 accellerator $ 80 2 32-meg 72-pin 60ns SIMMS $130 SCSI-2 module for accellerator. 430+80+130+50(shipping etc.) = 690 * SLICED my foot wide open. Blood is going everywhere. I left the case of my A4000 laying on the floor upside down the other day. Now I stepped on it. This sux. I just hope it doesn't get infected. -------------------------------------------------------------------- * PROGRAMMING TIPS FROM FD: lock=Lock("PROGDIR:"); then do Info(lock); to _ASK_ if the disk is write-protected without generating any OS requesters. Second, easiest way: try to write a temp file (or do a SetDate() or something). To prevent the requester from appearing, just load your process's pr_WindowPtr field with -1L: pr=(struct Process *)FindTask(NULL); savedPtr=pr.pr_WindowPtr; pr.pr_WindowPtr=-1; /* do your testing here */ pr.pr_WindowPtr=savedPtr; this field, if !=0 and !=-1, points to a struct Window whose screen is used for requesters that might appear during dos operations. If 0, the WB screen (default public screen) is used, and requesters get automatically cancelled if -1. You MUST restore the original value in case a CLI program filled it before calling chaos. I think VinCEd does it. ---------------------------------------------------------------------- * INClUDED Artur's B Polski descriptions. March 12th, 2001: Imbe sent in a TON of new gfx! But only the BEST ones make it into the Realms of Chaos. :) ----------------------------------------------------------------------- INCLUDED the following gfx from Imbe into the game! Aesculapius Agathion (Weird effect :)) I put in his Brown Bear as the new Grizzly Bear! (It was too blocky so I antialiased it just a little) Chronomancer! Combat Drain Beam (use old Combat Drain Beam as one of the other beam drain spells?) Consecrate looks great! So do the variations! Cursed Sword (I antialiased it) Dao (WOW!) I antialiased it a bit. Demonic Touch Beam Horse (I fixed it and antialiased it.) Marid (WOW!) Wight (He looks very scary!) Wizard 4 (I had to scoot it over 1 and test it! The 1st frame was in the corpse area) Wizard 5 looks similar to Marid. Wizard 8 (I had to scoot this one over also) HE LOOKS COOL! Betrayal (imp turning away from master) I had to antialias it some and add some more detail. Subversion (imp facing master being charmed with magic) I had to antialias it some and add some more detail. ----------------------------------------------------------------------- The following gfx and all others that he sent, I put into gfx/unusedgfx/Imbe I was going to use Arctic Wolf but Xav already made a new one of it. Note: If you set your grid to 16,16 it really helps to keep things aligned when you move things around. Bless looks good, should I use it ? The Ghoul looks good but I liked the old ghoul. What should I do? The new confidence spell makes more sense. But then what would I use the candle for? I would like to use these as something else but I don't know what? Banderlog Bolter Cloak Dark Power * Imbe is officially inducted as a member of the Chaos gfx team! Go Imbe go! Yay Imbe! March 13th, 2001: My foot and leg feel strange. Parts of it feel numb. I don't know if this is from some internal infection or if it is just because I have been walking around on my foot sideways all day. It really hurts my foot to walk sideways on it, but I'm afraid to just walk normal. ------------------------------------------------------------------------- .animbrush EOR drawbacks. ------------------------------------------------------------------------- According to the Motorola 68030 Enhanced 32-bit Microprocessor User's Manual: Assuming nothing is in the Data Cache and all An are pointing at FASTram: move.l Dn,(An)+ = 3 cycles eor.l Dn,(An)+ = 6 cycles However if An is pointing to something that is in the datacache then it should look like: move.l Dn,(An)+ = 3 cycles eor.l Dn,(An)+ = 5 cycles The whole point of the .animbrush format is to write directly to chipram and allow instant forward/reverse playback and not use double-buffering. If the data being written is in chipram as intended then... everything will be much much slower. Its too scary for me to even think of doing the calculations. :) But it would look something like eor.l Dn,(An)+ = 12 cycles on 25Mhz 030 eor.l Dn,(An)+ = 20 cycles on 50Mhz 030 Double, triple or quadruple the times if the gfx mode is a highres/lots of colors/doublepal mode. It probably takes ~80 cycles on a 50Mhz 030 to do it in 640x512x8bitplanes doublepal mode. These are just estimates. .animbrush format is looking worse and worse all the time :) Maybe we should concentrate on a .animbrush to .anim converter and/or a .animbrush to "all tiles on 1 huge screen" converter? ------------------------------------------------------------------------- End .animbrush EOR drawbacks. ------------------------------------------------------------------------- We ventured to the computer store. WOW! This place turned out to be the MEGA-Computer-Store! It has 180,000 square feet, 50 foot ceilings, it has EVERYTHING! They have a bunch of halfway reasonably priced tower cases! I saw some tower cases with 250 watt power supply for only $50.00. There was even a mini-tower case (AT) with 200 watt power supply for $29.00!!!!!!!!!! Even _I_ can afford that!!!! Unfortunately I have now idea how big a case needs to be to fit an A1200 motherboard + addons. So I didn't buy one :( I bought 2 EDO 72-pin 60ns SIMMS for $40.00 each. I was going to buy some power extension cables and power my drive off of my A3000 power supply since my A1200 and A3000 will be sitting next to each other anyway, and since my A3000 power supply won't doing anything anyway. But then I saw something interesting! They have a connector that connects onto my A1200 motherboard 44-pin 2.5" IDE connecter and on the other end is a standard IDE 40 pin 3.5" connector! And the 2 power pins are connected to a standard hard drive power connector! This means I can mount a 3.5" IDE drive into my A1200 case and power it internally!!!! Or I can mount a 3.5" SCSI drive and power it internally!! Wahoo!! I just hope it will fit. I also bought the largest rubber feet I could find to stick onto my A1200 to raise it up off the table to allow air flow under the case to keep things cool. March 14th, 2001: ----------------------- Begin LOS Bug ------------------------------------ * BUG: Sometimes if you press the L, S or C keys in a certain way then you can cheat because the little boxes have erased a small part of the gfx and it allows you to have Line of sight to things that you are NOT supposed to be able to see! This bug only happens in NONexploration mode. Exploration mode does all its LOS testing on the ShadowBoard so it is unaffected by any lines drawn onto the screen. Modify all keypresses to eliminate that LOS bug! DO NOT ERASE THE LINES, yes that is fast but it is incorrect. The actual graphic of the cell must be redrawn! Options: 1: Copy the entire screen (or just the affected cells) to a fastram buffer. Restore this from the fastram upon finishing the highlighting. Disadvantage: Slow to highlight. Advantage: Fast to unhighlight. 2. Don't copy anything anywhere. Just ReDrawCell() the affected cells! Disadvantage: Slow to unhighlight. Advantages: Fast to highlight. Doesn't require extra memory. This method WILL BE as fast as option 1 once I implement all images into fastram and use my asm rendering routines! ExplorationMode highlighting doesn't need to be changed! It doesn't test the screen pixel for LOS. It tests the ShadowBoard. NonExplorationMode is the only mode with the bug. ALL NOW FIXED. ------------------------ End LOS Bug ---------------------------------- * PROBLEM: When the dungeon is composed of Apple Woods, each turn takes forever! This is because EVERY Apple Wood, performs special combat on EVERY other Apple Wood! I have now implemented a new menu option for Silent Special Combat. So this is NOW FIXED. March 15th, 2001: * Compiled, tested, compressed and mailed Joar's version. (3 hours). March 16th, 2001: * Conducted many timing tests using BusTest (Aminet:util/moni/bustest.lha) on my A3000. 1 guy on irc tested his Blizzard 060 50Mhz and got bad results but he was using a cgfx screen on his gfx card so I have NO idea what screenmode his chipram was in. I discussed accellerators with various people. Helped Jerry put his new computer desk together. March 17th, 2001: * I fixed Imbe's new Pegasus with better antialiasing. It is a combination of Xav's Pegasus with Imbe's animation. Teamwork rulez. :) * Wasted all day talking to idiots who _allegedly_ wanted to sell their amiga equipment but not REALLY. * I compared the timing tests from various people's computers and the results are: Apollo cards are faster than Blizzard Cards. Apollo SCSI sux and Blizzard SCSI is much better. March 18th, 2001: Wasted more time shopping for Amiga stuff. * Included Artur's Polski Spell descriptions A. On 19-Mar-01, Delacroix the Documentator wrote: > Just noticed this in the game (first game I've been playing since more than > 1 month!) > > * I threw a hand grenade on a (cloaked) wizard surrounded by 2 generators > and 1 cow catapult (and another creature IIRC). But each of the 5 objects > gave an alleluiah, and all were completely destroyed, except for the wizard > (but they shouldn't have been destroyed since they had enough life points). > On the subsequent bonus pannel I got 5 bonus kills: five times the same > wizard (who got killed by another creature in the meantime). NOW FIXED. ************************************************************************ Begin: Random sound bug fixed! ************************************************************************ On 18-Mar-01, Artur Chlebek wrote: > Welcome James. > > On 19-Mar-01 you wrote: > >>> Have you definately fixed that sound-looping/hanging bug ? > >> No. I sent the fixed version to a Professional Chaos Player by the >> name of Artur Chlebek and he reports the bug is still there >> (sometimes). > > Yup, very rare but it still happens. :( But doesn't it seem like it doesn't happen as much since I did the fix? >> I played a real game the other day with many ghosts doing many >> attacks and the bug never struck. For me the bug seems to be >> eradicated. > >> It honestly seems like a bug in the AmigaOS FindPort() routine. > > This is the reason of that bug I hope (PatchWork output): > > exec.library FindPort("JCSound.1") Severity 2: Forbid() missing, unreliable > result PC=019FA472 TCB=01801008 ("Background CLI") Data: 00000001 00000001 > 000003ED 01801E8C 00000018 0060094B 006008ED 00000002 Addr: 01802D61 > 01802D58 01801E8C 01802D60 018028F0 01802D58 01080CD0 01A8564C ----> > 019FA472 - "ram:ChaosDir/JCsound" Hunk 0000, Offset 0000299A WAAAAAAAAAAHOOOOOOOOOOOOOOO!!!!!!!!!!!!!!!!!!! PATCHWORK RULEZ!!!!!!!!!!!! In the future if you ever see any "Forbid() missing" things that is VERY BAD and I need to know about them immediately! Missing Forbid()s cause all sorts of TOTALLY BIZARRE, always random, not humanly understandable bugs!!! I think I ran patchwork before months ago. But it didn't help me any. I think I was using it to try to track down some startup/shutdown problems and I never activated any sound effects. * BUG: JCsound is doing a FindPort() without a Forbid() Permit()!!!! This is TERRIBLE! The reason I didn't know about it, (or even think about it) is because the JCsound source code is in its own dir so Flashfind from "" FindPort doesn't find anything when I am in the Chaos dir. (I am always in the chaos dir.) I had no idea this code was in there! Its just some cut & pasted code from Aminet to interface to the minrexx.c * SOUND BUG NOW FIXED THANKS TO ARTUR CHLEBEK! ALL HAIL KING ARTUR! * JCsound is now at version 1.01 ************************************************************************ End: Random sound bug fixed! ************************************************************************ * I played a test game and the sounds seem to work 100% now! I didn't notice the speech bug either! * During my test game I found another little flaw with PatchWork involving InitSemaphore(&flashysem). NOW FIXED. * I no longer get those "Semaphore has nesting of 1, expecting 0" messages when I quit the developer version. This is sort of strange because that message is only involved with the BoardLock semaphore not the flashysem semaphore. More unsolved OS weirdnesses. * Chaos is now allegedly 100% bug-free! * Included Xav's new Centaur, Horse, Hybsil and Unicorn into the game. They have MUCH better running animations now! * I drank some caffeine (I haven't had any caffeine in around 10 days) and sat down and anti-aliased the Marid and the Wizard 5. * I changed 1 frame of the Wight. I antialiased Wizard 8. March 20, 2001: I'm using Xav's new animated wall as the Force Wall. I thought about using it as the new Power Wall but the Power Wall has 9 damage variations and the Force Wall graphic has 0 damaged variations. I don't have time to draw the damaged variations right now. Perhaps later on Imbe, Robin or Xav will do them if they want. Force Wall* It would take some serious magic to get one of these onto your spell list. In fact, thus far, no wizard has ever succeeded in getting a Force Wall onto his spell list. These walls are just about impossible to obtain and are damn near indestructable. Many military complexes and dungeons have been built from these walls for exactly these reasons. ForceWallID ForceWallHorizontalID ForceWallVerticalID Max stats and max recovery rates. Tested and works perfectly. March 21, 2001: * I antialiased Wizard 1. Then I experimented with some lighting fx, added a couple of frames and the result is... I'm not sure if its good or just annoying. What do you think? * Included Xav's new Bird Lord, Pox Shield and Ride gfx. The Ride gfx is much MUCH better now! Thank you! March 22, 2001: * Included the following new gfx from Imbe: ----------------- Discard (I antialiased it) Earthquake Shield Falcon (It was totally broken due to large amounts of color 32 splattered around. Then I antialiased it.) Fire Shield Wizard 7 (I like the magic flowing up and down the staff and the hand movement. I don't like the foot movement. While the head floating off is rather funny, I'm not sure I really like that in a wizard animation. I guess we will vote on this one.) Wizard 8 (need to antialias this!) Elephant ---------------------------------------------------------------- * Put these Imbe gfx into gfx/UnusedGfx/ Fire Elemental (Hmmm.. this one was just too weird for me :) But I'll try to use it as some new creature.) Emerald Dragon (Its a great _idea_ but the way it worked out, the animation is too jerky and not smoothly flowing. I think long sweeping motions would work a lot better than the short jerky motions.) Pegasus (I liked the previous Pegasus better.) * Included Xav's updated Derro, Nightmare, Omnibiologist, Shadow City * Xav's Disection has a VERY cool looking lightning bolt on it and I really like it! _but_ when I look at 1 (lightning bolt) 2 it makes me think that a lightning bolt will hit the target and split it into 2 parts. So I modified this gfx to look like a 1/2 symbol since the spell cuts everyone's life in 1/2. Xav fixed up Wizard 8 while Imbe was making a new wizard 8 so now I must 1. Copy the bottom part of Xav's wizard onto the NEW Imbe wizard. 2. Copy the head. 3. Antialias everything. Wow! That took a long time! March 23, 2001: * WOW! Joseph just taught me how to do Stencils in Dpaint! This is totally cool! If I would have known about this before I could have saved at least 30 mins of time when editing Imbe's Wizard 8 to have Xav's new Wizard 8 clothes! * I Put the fixed JCsound + the Semaphorefix into v3.04 and then UPLOADED v3.05 to Aminet. * Zoltan sent in a mod he made himself titled The Mysterious Land, at first I wasn't going to use it because I don't like listening to it "by itself" but now I am going to included it into the game because I think it will be ok music to listen to "in the game" while looking at pix of magic spells and fire breathing dragons and such. I like the composition of this mod, (its mysterious :) I just wish the instruments were higher quality. This mod was submitted in XPKSQSH format so only users with XPK.library installed will ever hear it. * Zoltan sent in another mod titled Land of Magic by Elvis. Its very nice sounding with excellent instruments but its very very short. It sounds like an "Artur Chlebek Mod" :) Maybe someone will lengthen it someday? * Sent the new JCsound fix to Robin and Zoltan. (I already sent it to Artur). ====================================================================== * Xav sent in more gfx! Drain: The old Drain matches the opposite spell (Haste). But your new Drain looks better so I'm using it. Jann: Included into the game. Joker: I really like him! But he looks like a creature, not a magic spell. So I don't know what to do with this... We need 32x32 tiles for this then we could make him look like he is a pic on a playing card. That would be a perfect Joker. For this moment he goes into gfx/UnusedGfx/ while I decide what to do with him. Radioactive Land: I like this new version much better! Thundermare: It looks better but I'm not sure if this should be the new Thundermare or the new Iridium Horse? I guess I will wait till someone makes a new Iridium Horse then I will decide. :) Vitality: Wow! Both the new versions are very cool! I included this into the game and I hope I can think up a new spell to use the yellow-heart version! *think* *think* damn I can't think of anything... oh well... maybe someday. Wizard 7: I don't really like the Leg Movement. I added your version onto the Wizard 7 Screen. There are now 3 main versions on that screen: The James version, The Imbe version and the Xav version. Wizard 8: Auugh! We both did the same work! My version had some wrong color #32 which I fixed. I cut & pasted your tile 17 into my version. Rest of tiles: I don't know what to do... Maybe I should stick to coding from now on. :) =========================================================================== On 23-March-01, Joar Berntsen wrote: > i moved with a flying carpet into a pit south of the wizard, hoping i would > float over it, not!. then i did the same to a bat,, not! :) > > to me, the wizard is north of the pit i falled into, and still alive.,.??? * BUG: If a mounted wizard moves into a pit then the wizard becomes "there but not there". He isn't there so he can't move and he can't be killed. But he is there so he can still cast spells. NOW FIXED. * BUG: If an Aerial Servant is on a scroll and flies 10 squares away into a pit, then the Aerial Servant dies as normal but the scroll he was standing on disappears also! Even though the scroll was nowhere near the pit! NOW FIXED. * BUG: If a creature is standing on a dead body and moves into a pit then the dead body disappears! NOW FIXED. March 24, 2001: * SLOW: Aerial Servants always take a couple of seconds to decide who to attack. I think this is due to the DangerousnessRating() routine being very very slow. It is filled with lots of redundant array bounds checking and uses lots of array indexes instead of pointers. I have now rewritten this so it should be at least 2x as fast now. NOW FIXED. * I speeded up RaiseDeadRating() in the same manner as DangerousnessRating(); On 24-Mar-01, Robin Schmidt wrote: > You should teach the computer that sleeping creatures are not really worth > attacking. Situation: Vampire (sleeping) next to a Green Dragon (enemy), > both next to one of eight wizards who all play in the same team (thus making > the danger of someone calling Wake on the vampire void (if one can say > that?)). The wizard (upgraded with Sword of Sassenrath) attacked the > vampire, the dragon then killed the wizard. Ouch! NOW FIXED. * Implemented a table of CellAddress[] to store the address of the first byte of each cell on the board. This allows fast and easy lookup by my upcoming asm rendering/animation routines. March 25, 2001: Think about replacing the DrawCell(&NothingImage,cell) with a bunch of move.w's. Redrawing the line of sight on a large empty screen is VERY slow in non exploration mode! This will actually be very easy! Just copy the code from the cell highlighting !!! Wow! It will be SUPER FAST! Go through the program and actually do this! DrawCell(&NothingImage,cell); -> DrawBlankCell(cell); DrawCellShadow(&NothingImage,cell); -> DrawBlankCellShadow(cell); Disadvantages: 1. This routine is useless once terrain is implemented. 2. One more routine to upgrade into 256 colors mode. Advantages: 1. ReDrawCell(cell) will be greatly speeded up when used to unhighlight a bunch of blank cells. 2. The Animator task will be much faster when having to REDRAWALL==YES; Such as exiting an info panel in Exploration Mode. * IMPLEMENTED DrawBlankCell() and DrawBlankCellShadow() * TIMING TEST on my A3000 25Mhz 030: Doing 1000000 Nothing takes 48 frames. 36743 (36695) frames to DrawCell(&NothingImage,0); 27.2 images per frame 4399 ( 4351) frames to DrawBlankCell(0); 230 images per frame As usual my custom routine is 8.4x times faster than the OS-based routine. The _AMAZING_ thing is that once I have time to implement my asm cell rendering routines that I wrote 3 years ago, ALL gfx drawing will go almost as fast as the DrawBlankCell routine! The new routines will draw a pic of a monster almost as fast as a blank cell. * BIZARRE BUG: If you are playing a game in Exploration Mode and for some reason a requester should appear onto the game screen (for example a "Disk is Write Protected" requester) then you can cheat by moving the window around. It somehow _magically_ uncovers any stuff (creatures, scrolls, inanimate objects, anything) in the unexplored territory! Yet it doesn't mess up any gfx at all! It's totally bizarre! I always wondered how on Earth this was possible. Now I figured it out! It was all because when I set up the ShadowBoardRastPort I just copied the rastPort of the main board into it! This copied the layers information which caused the OS to provide this most unique and amazing behavior. I have now changed the code to just do an InitRastPort(ShadoBoardRastPort); so this is all NOW FIXED. * Included: Artur's Polski spell descriptions for the 16 new spells introduced after v3.04. His spell description translations are now complete except for the 6 new spells I added in the last couple of months. * Included Artur's new Vampire attack and death sounds. They are high-quality but very long. The attack sound is about 6 seconds long! I think people will complain about this. Oh well then they can make their own new Vampire attack sound or they can turn off the combat sounds. March 26th, 2001: * Included Robin's complete 366 Deutsch spell descriptions, latest Deutsch.catalog and Talklistsdir/Deutsch file. On 25-Mar-01, Robin Schmidt wrote: > AI: 1. I just saw a Basalt Golem shoot at a Shadow Dragon who has already > been stunned. This is stupid. There've been other targets in range. NOW FIXED. * STUPID: Basalt Golems shoot things that have 0 movement points. NOW FIXED. * STUPID: Spectators attack things that have 0 manuverability points. NOW FIXED. * STUPID: Spectators keep constantly attacking my Conwell's Cow Catapult even though it already has 0 maneuverability and they aren't hurting it at all! NOW FIXED. * STUPID: All creatures which attack only non-lethal stats (such as Maneuver, Move, Combat, Ranged Combat, Special Combat, all Recovery rates) will frequently make useless attacks against creatures whose stats are already as low as they can go! NOW FIXED. * I optimized the IsStupidAttack() and IsStupidShot() routines to speed them up. But then I had to add tons of new code to check for useless attacks so all in all it will be just as slow as before or even slower. I think this is why it takes so long for an Aerial Servant to decide who to attack; its because he must check nearly every square on the board if it is a stupid attack or not. Its a rather large hunk of code that must be executed for each sqare. * I added code to IsStupidAttack() and IsStupidShot()to check for and avoid useless healing attacks. Such as Hippocrates healing someone who already has MAX_LIFE. I've never seen such a thing happen, and in fact I think the other AI routines prevent this from ever happening... but the code is in there now just in case. March 27th, 2001: * PROBLEM: If you attack an enemy Hippocrates' Combat statistic it actually gets better! The Hippocrates becomes a better healer than ever before! NOW FIXED. See below. * PROBLEM: If you heal your Hippocrates' Combat statistic (for example shooting him with Aesculapius) then the Combat actually gets worse! It can even become positive so that Hippocrates becomes a fighter like everyone else! NOW FIXED. See below. I think the combat routine needs to be modified so that if a creature with positive combat attacks the Ranged Combat of another creature and that creature has negative Ranged Combat then the Ranged Combat should NOT be lowered further but in fact should be raised toward 0, thus damaging that creature's healing ability. * CHANGED: Now if you attack someone's Combat, Special Combat or Ranged Combat you make their stat move towards 0. You do NOT mathematically lower it. I think several people had asked for the above change over the years (I'm not sure, I can't remember.) So hopefully everyone will be happy now. :) On 26-Mar-01, Robin Schmidt wrote: > On 25-Mar-01, Robin Schmidt wrote: > > ->> How many emails did I send you today? :) Anyway: I finished (!) the > ->> translation of the talklists today, > > -> I thought Deutschian Grammar was too complicated for talklists? :) > > Well, as I told you it was like impossible to just translate the talklists > to German. But I totally re-wrote/re-arrangend the lists, so that now there > is a perfect German translation. This meant to write some lists twice or > even thrice to solve some problems with singular/plural and > male/female/neutral versions of one and the same word. I'm so great! > > ->> but there is something wrong. It worked > ->> all okay for some turns and then crashed (Guru). I think there is a loop > ->> somewhere. You told me of a program (arexx?) you have to check/build > ->> talklist sentences. I haven't got this. Could you send it to me, please? > > -> Ok I attached the Arexx scripts for checking talklists. > -> Please let me know if these help you any. > > Well, they did. There wher serveral 'Can't find list xxx' errors due to > typing mistakes. I hope this caused the crash, but I can't be sure of > course. But when I used the GenerateText.rexx everything looked fine. > > I had to change the catalog again in order to translate the talklist > correctly. I hope this works. > > Attached are the spells, the catalog and the talklist. You can append them > to your verion. > > L A T E R: > I had another try with the talklists. Chaos still crashes sometimes when the > computer wizards talk. CheckTalkLists.rexx cannot find anything, so it can't > be an infinite loop. Perhaps you have more luck and find something. What the bug was: I had a string on the stack that was 40 bytes long. I remember making it only 40 bytes when I first coded the routine because I thought I was going to make the routine recursive. Thankfully I was smart enough to make it use a loop instead of recursion. But I didn't think to increase the size of that string to something really huge once I prevented recursion. The string is used to hold the _name_ of a list. If you had any listnames longer than 39 chars then some other stuff on the stack would get overwritten. Like for instance the other variables and the return address. Upon executing the RTS instruction *BOOM*. The Deutsch talklists file has 2 lists longer than 40 chars. So I fixed it by making the maximum length of a listname be 256 chars AND I put error checking code in to return an error if any listname is over 256 chars. NOW FIXED. * NOTE ABOUT TALKLISTS: You should try to make sure that your generated sentences cannot go over about 220 chars because that is about the realistic maximum amount of text that will fit onto the bottom of the screen. However if you accidentally exceed this, no harm will be done because the internal buffer is 512 bytes long for the entire sentence. If you somehow generate a sentence longer than 512 bytes then *BOOM*. On 27-Mar-01, xavnet wrote: > News: > - Virtue: you're going to have a shock! :) > It 's a symbol of a virtue... I think... But nowadays... I'm not sure... > :-D > > - Vampire : new version. > > - Fire Shield : updated > > - Earthquake Shield : updated > > - Discard : updated. I add a trash and I enhanced the costume. > > - Cat Lord : updated. * Included: Xav's new gfx: Cat Lord Discard Earthquake Shield (Nice Shading!) Fire Shield (Nice Shading) Vampire (I always liked the old Vampire. He's not perfect but I like gfx with waving cloaks :) Old Vampire's legs could have been better. But the new Xav Vampire is a better animation and design so I'm using it.) Virtue: HeheheheheHAHAHAHAHA OWW! I'M DYING LAUGHING! :-D * Included: Imbe's new gfx: Falcon (He added 1 frame) There was a line of color #32 in the corpse tile which I removed. I antialiased all frames a little bit. The Falcon is Awesome! Fly: I antialiased it and improved the back wing. If this were an animation it would make a FANTASTIC Pixie creature! Generator: COWABUNGA! Nice animation! NOTE to Imbe: please press the "g" key to turn on the grid (16x16) when you move the old animation around on the screen. That way it is always placed correctly. Thank you. :) Ack! I just loaded the Generator into the game and some of the tiles are not placed correctly! Many gfx bugs in this! Please please please _always_ turn on the Grid with the "g" key in Dpaint when moving and placing tiles! The Grid function Rules! 1 hour later: The new Fixed Generator arrived and I included it. Thank you for the fast response. :) Ghast: Wow, this is weird looking. I antialised it and made it look much better but I think Xav needs to examine this gfx. Be sure to watch it as an actual animation in the game. It doesn't look like a Ghast to me. It looks like some sort of strange alien creature or sea creature. Ghoul: I don't know what to do about antialiasing this. (???) I leave it to the professional. :) The red dots animation could be somehow better. Giant Rat: I antialiased the tail. * Imbe New Cell Effects: Attack: Its very nice! But I already made a new attack cell effect out of Xav's animation + my numbers. So we need to think up a reason to use this NEW Imbe attack fx. Does anyone have any ideas? For healing attacks? For poisoning attacks? For attacks against statistics other than life? ??? Twirl: WAHOO!!!! Finally a new Twirl gfx!!!! I TOTALLY _HATE_ the old Twirl cell effect! The old Twirl gfx hurt my eyes! This new one is much better! But it could be better still. I quickly single-pixel antialiased it but it really needs double-pixel antialiazation. I just tested it in the game and it looks REALLY COOL!!!!!!!!! NOTE TO EVERYONE: Cell Effects can use LOTS of frames, like 50 or 100 or whatever. I can _EASILY_ play cell effects animations at 25 or 50 fps so we can use _REALLY_ detailed animations on these if you want to make them. * Imbe gfx not included (yet): Flesh to Stone: I liked the current Flesh to Stone better. Free All: Nice Graphic! But if I use it, it would have to be for "Free" not "Free All" I think. I think Free and Free All should be graphically related. I don't know what to do about this one. I am putting it in UnusedGfx/Imbe until we figure something out. Floating Eye: Things I like: Its animated. Things I like about the original floating eye: It has a Pupil. It is bloodshot. I don't know what to do about the Floating Eye gfx. I will put it into UnusedGfx/Imbe/ for now. March 28, 2001: Imbe Writes: > many times when im in the spell selection, i dont feel I have an overview of > my spells. If they were more organized, it would be much more comfortable. > examples: > > m=growth, misc cc or cm or cs cc or cm > s=status spells cc cm um cu cs > c=creatures uu cm cs uu cs > u=undeads uu cm um uu us > mm us cs mm us > mm us um ss us > ss us cs ss us > ss us um ss ms > > or u could just display them by order, e: c-u-s-m above. > > I dont know if its the actual number of spells, but u get the idea. If I implement this, I will have a "Sort" button that you click on and it will sort your list of displayed spells for you. This way you will see the spells in their actual order (this is very important when you stop casting spells and get lots of bonus spells because the ones on the bottom get pushed off.) But if you click the "Sort" button then you will see them in the sorted order. Ok, so now I could easily implement this... BUT... what if someone doesn't like this particular sorting methodology? What if they want undeads listed first, then magic spells, then all other creatures? Or what if they want "weird attackers" like Mind Flayers and Juju Zombies listed first? Or any other weird things? This would mean we would need a very fancy GUI system so that each user could set their _own_ personal preferences for how the list is sorted. Later on this GUI can be extended to provide support for customizing what is shown at the bottom of the screen. It doesn't have to say "Unicorn (Life 10)" It could say "Unicorn life 10, combat 15" (in different colors) or something. There are an infinite number of ways to customize how things look. And I have _no_ ideas how to code the GUIs for them. As everyone knows, I _hate_ programming GUIs because there are an infinite number of ways to design them, and many GUIs are just as good as many other GUIs but they look totally different. Some things are factually easier, but a lot of it is just subjective opinion style. So this now brings up something I've been thinking about for a long long time: Allowing Chaos to be extendible via external code modules. These external programs could be coded in any lanugage: C, Asm, Blitz Basic 2, Modula 2, E, Arexx, maybe even AMOS (oh no!). You could even use MUI or Datatypes if you wanted. So we would have to decide this question: Should the external programs be loaded via "LoadSeg()" or should they be run as a cli command? (Or should there be support for both options?) What functions within Chaos would you need access to in order to make your coding easier? What variables would you need access to? On 28-Mar-01, Robin Schmidt wrote: > Greetings, Master Conwell! > > I did it all ... I meditated ... I didn't eat or drink for a week ... I > hadn't had sex for a year and a day ... I didn't curse or swear ... I > concentrated all my powers. Then when I was ready I opened the Dark Gate and > passed it ... I walked through fire and ice ... faced storms and floods ... > I subdued the One ... I prepared myself. At last I started Chaos 3.11 ... it > looked all fine, too fine for my suspicious eyes ... I started to search ... > I found some things you should improve ... Wow! You really should think about writing more spell descriptions with a writing style like that! > 1. The Goblin Bomb looks ugly. Why didn't you include my great (?) > explosion? I told you I've been overloaded with coding requests and gfx requests and AI requests and shopping for an Apollo 060 and etc. etc. So I have not programmed in your 3x3 tiles thing yet. I figured I could do it when you figured out how to generate twice as many frames out of the explosion. I work on Chaos for 8 hours a day every day! But I have 32 hours of work that need to be done each day! So I fall behind by 24 hours every day. :( > 2.4. I think, independant > generators shouldn't create Magic Carpets as well as Grim Reapers. I will think about hacking in some code to stop Generators from producing Grim Reapers. It depends on what others think about this. I've only had 1 game where a generator produced a Grim Reaper. It was very interesting. On the one hand the Grim Reaper damaged a lot of independent creatures and killed some too. But it also killed a LOT of pieces of wall in the dungeon. This allowed all the other independent creatures to move into my area and attack me! So it really all sort of balanced out. The Grim Reaper also kept stealing my bonus spells. It was very annoying. It caused me a lot of damage and slowed down my invasion killed some of my Lions and I was very glad when I was _finally_ able to kill it. > That > makes no sense for the independants. Or can make Agents (Necromancer, etc.) > use of the carpet? Nice idea anyway... :) Nice idea... but a HUGE ridiculously large amount of coding and AI work so it won't happen this year. On 28-Mar-01, xavnet wrote: > Hi James! > > News: > - Vampire > I wanted to morph it into a bat... So I used the Morph feature of DPaint 5, > but I was disappointed by the result... So I had to work frame by frame on > this morph anim. > You'll find the 2 versions in the file. Morphing works better with Explosions. :) This is a REALLY COOL animation!!!!!!! > - Iridium Horse : new version. Ok, I've looked at the Iridium Horse and Thundermare and etc. I included your Iridium Horse as the new Iridium Horse. I will take your Thundermare graphic and remove the horizontal line animation on its body and then that will be the new Thundermare. DONE. There will be a system to the gfx: A horse-alike creature which is undead (or can attack undeads) gets a horizontal line animation on its body. All other horses just look normal. Since Thundermares aren't undead and they can't attack undeads then they don't have that body animation. Iridium Horses aren't undead but they can attack undeads so they get a not very bright animation on their body. This works out great! On 28-Mar-01, Robin Schmidt wrote: > 2. The sentences like "Gandalf's Vulture munches on some Pig meat. Life +4" > are not correctly displayed when you play in German. This is due to the fact > that I put some of those '%3s' from the catalog-file to the talklist-file to > ensure a correct translation. Can you do anything about that or do I have to > make a simple one version translation that says 'Your creature ate some > meat. Life increased.' everytime? Wow! You put parameters into the talklists!!! That was very clever! The reason it wasn't working for you was because I was plugging in the parameters first, then calling ReplaceLists(). But I can almost just as easily call ReplaceLists() first and THEN plug in the paramters. But I will have to change the code on each individual print statement for it to start working correctly. So leave your talklists and catalogs as they are. They are very good. I will fix the program to allow for this amazing new grammatical construct. OK, I now hacked in special code for the 2 lines in the catalog file that need to have "parameters in talklists" capability. Line 206 and 49. If this works ok and you need more catalog lines with this capability then maybe I'll make a new system that automatically allows talklists to work on ANY and EVERY catalog string. Would that help you any? > 3. What is the difference between Combat and Chainsaw (except the sound :) ? None. (except Chainsaw is more satisfying :) Combat doesn't need betatesting but Chainsaw does. Does that count as a difference? :) > 4. When a computer wizard casts Tribal Dance the game waits for a > mouse-click. There is no sound in this time. I deactivated speech. The only thing I can figure is that you just didn't have enough chipram available to play the music. So I added some error checking code. Now if it can't play the mod for some reason, an error message will be printed. > 6. Is there anything like 'lethal strikes' or something like that? I had a > Vulture with combat 5 attacking a Derro with 19 life. It killed the Derro > with one strike!? Yes, but only if impurities are turned on. * I sent the help files, the latest .catalog file and the 8 new spell descriptions files to FD for translation and proofreading. March 29, 2001: * I recieved FD's translated help files, catalog file and all 8 new spell descriptions! In only 24 hours! Frédéric Delacroix earns "Fastest Translator in the West" award! (again) Frederic Delacroix wrote: > Translating is easy and relaxing :-) That's what I keep telling the other translators... but they don't believe me for some reason. * I spent some hours trying to figure out what is causing Robin's sound bugs. He reports the Ghost sound still gets stuck in a loop sometimes. I found nothing useful so far. :( * Included Xav's new Abath gfx. On 29-Mar-01, Joar Berntsen wrote: > > this is my gfx dir at this time, but it stops at reveal or the last > celleffect and displays a yellow "out of memory" message, then quits, > > i know it doesnt have anything to do with my wierd attack gfx. > and there are no patches in the system. > > because of this, i cant play chaos anymore :( OOPS! Sorry! I forgot to include the "wrap down to the next line" code when processing CellEffects in IFF files. NOW FIXED. I am compiling you a new version now, but it takes over an hour to compile Chaos these days. Attached: V3.13 main executable. On 29-Mar-01, Robin Schmidt wrote: > A wizard just cast Chainsaw twice on one creature?!? NOW FIXED. > Why do creatures with combat 0 attack? The way of the warrior is not easy. It requires much practice. With enough practice a creature can improve its attack ability. > Independant creatures, that get discovered by killing a growth, can move in > the same turn, can't they? But when their position is above the other > independant creature that discovered it, it can't move. Yes that is true. You have discovered another game secret. > Dragons scream when you touch them with a chainsaw!!! NIIICE! Hehehe }:> Imbe inscribed the following scroll on March 29, 2001: > doublecatlord: i chose catlord, and i have double, but i dont seem to get > permission to cast catlord twice. why not, or is it a bug? "There can be only 1!" (tm) :) Cat Lord at a time. It says so in the rules somewhere. :) > mintgen: the generator near the middel gets in mint condition, allthough i > have attacked it with my cobra so it has no recover left, and attacked with > eceryone else in the area. "Real" Generators are special. They are magical and have super powers. They have infinite healing abilities and don't use their Life Recovery Rate. In order to kill a Real Generator's Life Force you must kill all 63 points in 1 turn. That is part of the strategy of the game. :) March 30, 2001: * I spent all day reading the RKRMs over and over and reading the DevCD over and over and conducting experiments to try to make JCsound crash. No matter what I did, I couldn't make it crash. Here are some things I tried: Theory 1: JCsound is loading from the RAM: disk and some other program kicks in and writes or reads from the RAM: disk at the same time. This causes a crash. This theory is mostly disproven, see Experiment 1. Experiment 1: I had a loop of JCsound playing over and over again. I then went to CED and continuously wrote out large files to the ram disk. No crashes, no problems. Lots of stuff deleted... March 31, 2001: * Included Robin's Deutsch help files. * Robin sent in a bunch of cell effects animations! Some of them are 100 tiles long! WOW! But I'm in the middle of coding on JCsound so I will have to look at them and/or program them in later. * Imbe sent in a new Vulture but I haven't had time to decide if I should use it as a Vulture or as some other flying creature? * Imbe sent in new Goblin and Gobln Bomb gfx which I put into gfx/UnusedGfx/ ******************************************************************** More work on JCsound ******************************************************************** Test my combat ghost killing thousands of things! over and over! To see if it crashes. No crashes! The GetMsg() code looks suspicious. NO! I send 1 message and I get 1 message! That is all!!!! Try to investigate speech routines stack variables and things. There are no stack based variables in the speech routines! How could this be messing up!?!? Check syntax of DeletePort! Its ok. 6. Make a test program that reads and writes files to/from the RAM: disk while repeatedly playing JCsound samples FROM the RAM: disk. I tried this and nothing bad happened, although the left and right channels become desynchronized. 7. Set the buffers on the drive to 0! Then try to make it lock up! IT NEVER LOCKS UP! But it does cause the channels to become desynchronized! Compiling Optimization Stuff------------------------ JCsound is currently 18040 bytes. It is being compiled with data=far for some unknown reason? * I recompiled with code=near code=near made no difference because it defaults to code=near anyway. * I recompiled with data=near data=near made it 16168 bytes! I just saved 1872 bytes! Over 10% size reduction! * I recompiled with parameters=register parameters=register doesn't work because I lost my minrexx.c file somehow Ok I redownloaded minrexx.c from Aminet. parameters=register made it 15088 bytes. TOTAL REDUCTION = 2952 bytes (16%!) My old minrexx.o was 1972 bytes. My new minrexx.o is 1620 bytes. I had to make some changes to Arexx.c and minrexx.c to get them to compile with the OS 3.1 include files. ---------------------------------------------------------------------------- END JCsound 1.2 BEGIN JCsound 1.3 Copy everything over to sc:JCsound1.3/ in case I mess something up. * PROBLEM: When playing a sample with the -2 option the startup code is doing this: 1. Allocate 30k chipram buffer as left buffer 1 2. Allocate 30k chipram buffer as right buffer 1 3. Free right buffer 1 because this is a MONO sample and there is only 1 sound going out to both speakers. 4. Allocate 30k chipram buffer as left buffer 2 5. Allocate 30k chipram buffer as right buffer 2 6. Free right buffer 2 because this is a MONO sample and there is only 1 sound going out to both speakers. Needless to say this is wasteful and makes it slower for JCsound to get started. So I have now reduced it to: 1. Allocate 30k chipram buffer as left buffer 1 2. Allocate 30k chipram buffer as left buffer 2 NOW FIXED. * PROBLEM: Sometimes when playing sound with the -2 option (The -2 option is almost always used when playing sounds in Chaos) the sound channels start at different times. They are unsynchronized. This causes no real harm but I think Artur complained about it so... * I spent some hours studying the RKRMs and the Amiga C Manual and I finally figured out how to start 2 channels playing simultaneously. IF the RKRMs are correct and IF the Amiga OS audio.device functions as specified then it should now be IMPOSSIBLE for the channels to become desynchronized. NOW FIXED. Actually it is not TOTALLY IMPOSSIBLE for the channels to become desynchronized, all you would have to do is to disable multitasking for around 1.2 seconds (assuming 30k buffers) then things might get desynchronized. But 1.2 seconds is such an incredibly long time to disable multitasking that I'm not even going to worry about it. But if the buffers were set to only 4K then multitasking would need to be disabled for only about 1/7th of a second to possibly cause things to become desynchronized. Actually the books don't say anything about keeping double-buffering synchronized. You can use the OS to START 2 sounds playing at the same time and then you just keep queueing up more WRITE commands but it never says there is any guarantee that the future WRITE commands will be executed simultaneously. The audio.device docs clearly state that you cannot issue 1 write command to multiple channels. So what I am trying to say is that if you were to play a 10 minute long sample then maybe the 2 sides of sound would slowly start getting more and more desynchronized? I donno. If you try this under a heavy cpu and heavy hard drive access load then please let me know what happens. If the audio.device is programmed correctly then there will be NO problems! April 1, 2001: * I made some more optimizations to save 128 bytes of code size. * I changed the priority setting of JCsound to the first line of code so that, under a heavy multitasking load it will get started much faster. BEGIN: JCsound v1.4 * I think there was a bug in the stereo playback. NOW FIXED. * Implemented perfect synchronization code on the stereo samples! Does anyone ever notice a delay when loading a digital sound effect? The OS has to load the JCsound program from disk, relocate it, run it, the program then must open libraries and devices, allocate memory, blahblahblah, it is quite a large amount of overhead. But with so many people using 040 and 060 processors these days, I'm thinking nobody has even noticed it. To my mind, the sounds are not instantaneous like they should be. But on the other hand they are ok and I have only a 25Mhz 030. If you feel that the sound effects loading should be speeded up there are 2 main things I could do: Option A: Rewrite JCsound be pure and residentable. Option B: Rewrite JCsound to load into memory just once and get ready for accepting commands. Actually I had always planned to do this option years ago. But I don't understand exactly how to send commands to the JCsound program. I guess I need to force myself to read more manuals and stuff. * I Sent Zoltan the 16 new spell descriptions + the 8 new spell descriptions + the help files for translation. * I only sent Artur the 16 new spell descriptions. I Still need to send Artur the 8 new spell descriptions and the help files! IDEA: Make JCsound revert to 15k buffers if the 30k allocations fail. (?) If that fails, go to 4k. Would this be useful? Do people run out of chipram, causing the sound effects to fail? April 2, 2001: Imbe writes: > i wondered if u could make a save with all creatures,undeads and growths > packed in the board, because theoretically, it should fit, 16*16=256 > and it is over a 100 non living spells, isnt there? armour,magical attack > and such. > i know it could take a while to create it, but i would be able to see my new > drawings immediately, instead of having to play(wich i want ofcourse :) , > but i like creativity more) or renaming creatures. * Imbe wants a level with every single monster on it. I had planned to do this for Xav many months ago but I just never got around to it and Xav never asked for such a thing soo... I hacked in some code today: Make a quick loop attached to the Z key to insert every ID that is a creature, alternating between player 1 and player 8. * I made another level with all the growths in large blocks for Imbe. * Robin sent in a spell file and description and sound effect for the Soulsucker. The spell file and sound effect are good. I think I liked the description given in the Email better than this description though. When I implement this I will need to go back and read that Email. (search for soulsucker). * Problem: My "Chaos" sound sample in Mod.ChaosTheme13 sounds pretty dorky. Robin processed the sample and now it sounds sorta cool. Its very evil sounding! Sounds almost demonic. Augh! He's revealed my true nature! }:> April 3, 2001: Try the GetMsg() thing before deleting the ports! Do the WriteMsg() thing for how many messages were left! Try opening the audio.device ONLY ONCE for both channels. (?) Look in that Amiga programming book! That is how they did it! * Many many many experiments and rewrites deleted. They all crashed one way or another. April 4, 2001: After countless hours of trying millions of different coding techniques I am finally giving up on the "perfect synchronization code". The synchronization itself sounds great and works great. But then when I close the audio.device *boom* I talked to a lot of programmers and they all said audio.device sux. They told me the only thing audio.device is good for is to allocate the channels so that you can bang on Paula. I spent a few more hours trying to recreate v1.3 of JCsound and now finally, here it is. A 100% working version. It has no "perfect synchronization code". It is optimized a bit over 1.0 and 1.01 in that it does less memory allocations. This will be the sound playing routine for a long time to come unless you can find serious bugs in it (or you can find a better playback routine somewhere). I can't believe I just wasted SOOOO MUCH time on this! Is there sometimes a delay between the time the sound _should_ have started and the time that it actually starts? If so there are various things I could to speed up its loading and playing: A. I could eliminate all the arexx stuff. That should make it about 1/3 smaller and faster to get going. B. I could rewrite the whole thing and make it load into memory just once, then it would sit there and await commands. I don't know how I would beam the commands to it yet... Either with PutMsg() or with Arexx. AAAAUUGGH!!! It doesn't actually work! JCsound now works perfectly 100% of the time on some samples and fails 100% of the time on other samples! April 5, 2001: Ok, I finally figured out the bug in audio.device! It took 50 hours of hacking and slashing and trial and error but I think I _finally_ have a 100% version of JCsound that is rock solid and won't ever crash. NOTE: the other versions of JCsound weren't crashing on their own, it was actually audio.device going berserk and corrupting memory. You _must_ delete all versions of JCsound v1.3 or higher that you already have. They are TOTAL TRASH. I _recommend_ that you delete all other versions of JCsound that you have. I went back to JCsound v1.2 and manufactured a new v1.3 from it. This is the new 100% version. I took out all perfect dual-channel synchronization code to keep the program simple for now. Once this new version passes beta-testing I will _try_ to put the dual-channel synchronization code back in. JCsound v1.3 attached. How to install a new JCsound: 1. If Chaos is running then Quit chaos completely. I know it can be traumatic to have to quit the game but you can do it if you try really hard. :-D 2. Unlha the JCsound file 3. Copy the JCsound executable into your chaos/c/ dir Tada! That's all there is to it! :) * END OF JCsound V1.3 April 6th, 2001: * I carefully added 1 line of code at a time, recompiled and tested repeatedly, over and over, until I had all the code in to guarantee perfectly synchronized mono x2 and stereo sound sample playback. Everything seems to work perfectly!!! * I then went back and redid all the FreeMem's to go in perfect reverse order. This will allegedly reduce memory fragmentation. * I tested JCsound a zillion times and it always works for me now. Please let me know if you have any problems with JCsound V1.4 and if so, what exactly is happening. * END OF JCsound V1.4 I am now seriously considering removing all the Arexx code from JCsound (does anyone care? What real purpose does it serve?). If I did that then I think I could easily rewrite JCsound to be Resident and Pure! Then there would be 0 load time for JCsound and all sound samples should happen instantaneously! Questions: Why does Visage not work on my A1200T 060 + CGFX + OS3.9? It works perfectly on my A3000 but it says it "can't find mode ?" when I type visage df0:#? mode ? in the shell. It is as if OS 3.9 has a bug in the ReadArgs() function. It doesn't bring up the ScreenMode requester and it always tries to display the pix in gfx modes that my monitor doesn't support, so I can't see anything or I see a bunch of garbage. Does DiskSalv work on hard drives with the new FFS (bigger than 4gig drives)? Or will I blow up my 5 gig hard drive if I try to run it? What happened to Multiview in OS 3.9? When I type Multiview in the shell it can't find it. Did it get renamed or did the previous owner delete it? * Played around with my new used A1200T OS 3.9 to try to become familiar with it. Right this second I'm running a 640x400x64 colors Workbench in 73Hz on the flickerfixer. It looks very beautiful :) The new GlowIcons supplied with OS 3.9 are very cool! The hard drive in the A1200T surely makes a lot of noise... * Spent a few hours on IRC talking about gfx cards, gfx drivers (I talked to a person who designs CGFX drivers). I asked around if I could use one of my REAL Amiga keyboards instead of the lame PC keyboard, the answer was "probably yes". Voodoo3 is the absolute best driver/gfxcard combo available on Amiga right now. Voodoo4 and Voodoo5 drivers are crap because 3dfx never published the docs for them! April 7, 2001: * Included Xav's wild new Ghoul! Its an improved, colorized, antialiased version of Imbe's Ghoul. Imbe writes this idea: recently, i played a very long game, and the spell list were burned away. and i saw that the cpu wizards reached for the apple trees, and i did 2. when i got a new spell, i got very exited :) . but not when i had used it :( ,so i thought u could implement that a new apple tree or castle/temple were created when no other means of meditation were available. OR make a new spell that sets the wizard in a trance(meditation) and will gain a new spell in 2-3 turns. and the spell is only given when the spell list is empty. * Included Imbe's new gfx: Falcon (it moves up and down very smoothly) Golden Dragon (I antialiased it some more) Gravity Sphere (What is it? It looks nothing like a sphere. :) But it looks better than the old gfx so I'm using it. I antialiased it.) Grizzly Bear: He added a frame and changed some frames. (There was a bug: a line of hard black color #32 in the corpse. Now Fixed.) Ok, I watched the Grizzly Bear in the game and this animation still needs some work, it jumps badly in one spot. It needs 1 more frame between the last frame and the next-to-last frame. * I put these Imbe gfx into unused gfx: Goblin and Goblin Bomb: They have more frames of animation so I might use them.. I donno. But I like the colors of the old Goblins... so I am thinking of using these new Goblins as completely new creatures. Gooey Blob: It looks good but I like the old Gooey Blob. I have been planning a new growth. I can use this one for the new growth. Gorilla: I want to use this one as some sort of extra mean Gorilla. Vulture: I am thinking of using this as the Pterodactyl. Perhaps with more grayish colors. * MORE audio.device strangeness. (Letter to FD) What is going on? I thought the music system allocated the sound channels at max priority!???? Yet everytime I write a new email in YAM while the music is playing and I double-click on someone's name it makes a beep! It steals a channel from the music system! Isn't this supposed to be impossible!?!? This freaks everything out. After this happens the music sounds strange and if I play JCsound after this happens it goes crazy... but it hasn't crashed yet. Everything is bonked out. Can you set the music system to allocate all 4 channels at MAX priority so that they cannot be stolen? Merci Danke Thank you Muchas Gracias :) * I trimmed down the Generator gfx to only go through each color once. * I double antialiased Imbe's Twirl effect and now it looks better. * BUG! THE SPELLS GADGET IS BROKEN! Now matter how many spells you say you want, you always get 99. I wanted to play a quick game with only 10 spells and I noticed this! How long has it been like this? Ever since I added that code to put your bonus spells at the top of your list. So its been broken since December 31, 2000. NOW FIXED. * BUG: Play an exploration game as player 1 against a computer player 8. Now load a game of a human player 8 vs. a computer player 1. You will see the position of the enemy Player 1 for a second in the beginning! This is cheating! NOW FIXED! Imbe Writes: > Bugs: >trytoshootinradioactive: >i tried to shoot at radioactive with my elf, and he died (he's laying next > to my other elf), try to shoot with the other elf and you'll see. That is not a bug. That is a rule of the game. It does seem strange to me but it does provide a risk to shooting unexplored squares. > beforetwirlbytopguyinhvite: > i chose alliance and the jcsound must have crashed again by the top > hvite wizard. What does "hvite" mean? Jeg tudok nei Norsk. English takka du. :) Thank you for the sound bug report. I couldn't duplicate the bug so I can't fix it. It is probably just another bug in audio.device. audio.device sux! :( April 8, 2001: * FIXED some stupid bugs in the AI. April 9, 2001: Mod.ChaosTheme62 caused some enforcer hits when it started. Last line of WriteText() function (Text (rport, (char *)text, strlen(text)); Called by WriteNearBottom() (last line) Called by Chaos.c GetSpellSelection() (line 3773) The ChaosPearl.font in memory was overwritten with part of the XPKSQSH.library!!!! I know this because I could read the version info of XPKSQSH inside the font struct. The whole font struct was mangulated. I tried several times to duplicate this bug without playing that mod. I couldn't make the bug happen again. So I think this means it is a 90% chance that the bug is in XPKMaster.library. * Resaved Mod.ChaosTheme61 from XPKSQSH to normal uncompressed format. April 10-12, 2001: Spent many hours reading faqs and readme files about various pieces of hardware and software on the A1200T. Fiddled around with many MUI settings. Friday the 13th, April 13, 2001: * Included Artur's 8 new polski spell descriptions. April 14, 2001: On 14-Apr-01, Robin Schmidt wrote: > Hi! > > I don't know whether you fixed /this/: > > /My/ Magic Carpet was occupied by an allied wizard. In the current version it is impossible for Wizards to occupy allied Magic Carpets. But once I send you the new version you can test it just to be sure. :) > When I moved the Carpet, > I saw, that the 'dismount D' was enabled, so I thought: 'Cool, now I can > kick this wizard from my carpet and use it for myself!' But when I > dismounted, *not* the other wizard appeared, but */mine/* again! So I > replicated my wizard!?! > > I'm not sure what will happen next turn... > > The Carpet stayed occupied, but at least I could create new wizards each > turn! :) > > You said, you fixed all Magic Carpet bugs in your version that you're going > to send me ASAP. But this one seemed to me so very special, I just HAD to > tell you about it! :) Hehehe, it does sound very funny! :) * Included Artur's Polski help files. April 15, 2001: * I set up a parnet network between the A3000 and the A1200T. First I installed Parbench31.lha from aminet but that was crap because it kept generating enforcer hits from location 32 and it was slow. So I downloaded and installed parnet.device 2.1 and now everything works great! Timing test 1 I copied games:devcd/AmigaDeveloperCD_1.1.lzx to t: (20173265 bytes) Games: had only 30 buffers. T: was in the RAM: disk as usual. It took 415 seconds = 48610 bytes per second. copy the same file as above but this time games: had 530 buffers. SAME SPEED 415 seconds. copy games:devcd/AmigaDeveloperCD_1.1.lzx to work: 421 seconds. (Work: had 450 buffers) 47917 bytes per second. * I downloaded bustest off of aminet on the DSL connection and uhmm.. I'VE BEEN RIPPED OFF! I HAVE THE SLOWEST 060 ACCELLERATOR IN THE UNIVERSE! The only reason I paid $1075.00 for this Amiga was because Apollo was supposed to be the fastest! (And Apollo _040_ accellerators were faster in the tests). But the Apollo boards are obviously optimized for 040 and suck for 060 because the Blizzard 060 cards are about 6 megs/sec faster than the Apollo 060 cards!!!! This is terrible when using a gfx card! You need to be able to push as much data as possible as fast as possible! I could only find 1 guy on irc who had an Apollo 060 and his timing results were similar to mine. April 16, 2001: * Studied 060 asm coding techniques. * I checked version of every single file in my A3000 and A1200T L: DEVS: C: and LIBS: and copied over the files if needed. Parnet rules! I skipped copying over AHI stuff and Xpk stuff. I also didn't copy over some other old things that I never use or don't like. Make an lha backup of Workbench: and Work: and copy them over to the A3000 for storage. They are on CD_Image2:A1200TBackup/ DONE. 2. Figure out how I am going to format the rest of the drive. A: A 700 meg Chaos: partition? B: All the rest of the drive as a huge GAMES: partition? OOPS! There is ALREADY a 1 gig GAMES: partition! C: Perhaps 3 700 meg partitions? April 17, 2001: It took all day to lha my A3000 Chaos: partition. Lha would work for hours then fail. I guess it was running out of memory or fragmenting memory so badly that it would fail. I deleted tons of stuff first which reduced the partition down to 350 megs and 100's of thousands of files. After lha failed I transferred over the Dev CD and the Cats CD by themselves and deleted them + I found 2 old temp versions of Chaos and deleted them this totalled many thousands of files which greatly reduced the memory needs of lha. Then I lha'ed the remaining stuff (Something like 290 megs) and after many MANY hours it finally produced a 142 meg file. I transferred the file over parnet while watching the season finales of Buffy and Angel. April 18, 2001: At Artur's request I Spent more hours reading over Chaos/audio.c and JCsound to see if I could see any problems. I couldn't find anything suspicious. April 19, 2001: Robin reports: >* BUG: Tribal Dance mod doesn't play when casting Tribal Dance. This was very strange because it had always worked for me but I finally figured it out. I was playing the mod CreatureName(spell) which uses the name of the spell IN THE CURRENT LANGUAGE. Thus the mod would not play in any language other than English. I have now changed it to the correct creature_name[spell]. NOW FIXED. * RACE! A1200T 50Mhz 060 vs. A3000 25Mhz 030 A1200T uses IDE and A3000 uses SCSI. A1200T uses OS memory routines. A3000 uses Poolmem. Both systems are using 500 drive buffers. The races will be to compile the current version of Chaos. Compile a developer version of Chaos from scratch: A1200T 03:31 (211 seconds) A3000 16:05 (965 seconds) A1200T wins the race! 4.57x faster than A3000! Compile a release version of Chaos with full optimizations from scratch. A1200T 09:54 ( 594 seconds) A3000 52:12 (3132 seconds) A1200T wins the race! 5.27x faster than A3000! The A1200T SHOULD be a lot lot faster! But I made the mistake of buying the SLOWEST 060 card in the known universe (Apollo 060) which has very very slow memory accesses. :( If the SASC compiler was optimized to make use of the 060's dual pipeline I think that the 060 would perform 6x as fast as the 030. * Studied possible ways of using other sound cli programs and how in the world to know when they have finished running. April 20, 2001: Ever since I got my A1200T I've been having strange problems. 1. Ibrowse 2.2 shows garbage for its icons and default image thingys. 2. Dpaint 5 goes berserk and corrupts memory when loading any brush. It corrupts the mouse pointers on all screens, the gfx on the Dpaint screen and spews TONS of garbage all over the workbench screen. This is stupid. Everything worked perfectly on the old A3000. At first I just assumed this was a bug in OS 3.9 but now I have proved that it is a bug in cybergraphics.library. NOTE: I AM NOT USING CYBERGRAPHICS.LIBRARY! I HAVE OPENED 0 SCREENS ON THE GFX CARD! I AM NOT USING THE LIBRARY IN ANY WAY! But just _HAVING_ the ElboxVirge monitor driver in my devs:monitors/ causes cgfx to do evil patches to my OS which corrupt all my AGA software! I have now removed the ElboxVirge monitor driver and now all my AGA programs are working perfectly. At the moment there is NO WAY to have AGA and my gfx card coexist 100%! :( I must do EVERYTHING on AGA or EVERYTHING on cgfx. THIS TOTALLY SUX! I need to be able to, in the future, run Ibrowse and workbench on the gfx card to save tons of chipram while running Dpaint 5 and Chaos on AGA. Ok, I found the problem: There are some env: variables that control certain patches of cybergraphics.library. Some of the patches are called Planes2Fast, Supergels and SuperLayers. Manius says Planes2Fast was causing this problem. It makes sense so all I have to do is turn off these patches to make things work correctly. * I studied the proposed new 256 color palette and did various tests and made observations. * I made a new version of JCsound based on FD's theory for the audio.device bugs. (v1.4x x=eXperimental) Sent it to Artur for testing. Robin and Artur report that it works perfectly in the shell in mono in a 15.75Khz screenmode but that it does not work in a 30Khz screenmode with the -2 option. April 21, 2001: * I made a proposed AGA palette alpha version 1 with 125 defined colors which contains all the existing ECS colors + more shades. Sent it to Xav and Robin for comments, complaints, criticisms, etc. * I made yet another new version of JCsound with some changed code for the -2 option. (V1.4x1) Sent it to Artur and Robin. Now I made 1.4x2 and sent it to them. They report this one works perfectly. * The final bug in JCsound was that I was doing CMD_WRITE to the left channel then to the right channel. So I just assumed that the left channel would finish first and the right channel would finish last. But some times (all the time?) the buffers finished in reverse order! So JCsound would get a signal from the right port FIRST then a little later a signal would arrive from the left port. If the signals had arrived in the correct order or AT THE SAME TIME as I assumed then things would have been working perfectly for a long time. Anyway its all NOW FIXED. {}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{} * NEW GFX FROM IMBE! I put the following gfx into gfx/UnusedGfx/Imbe/ brightcreature.incomplete Hand Grenade Halfling (He looks very evil. He looks undead. Perhaps this could be an evil halfling? Or some sort of undead creature? Haste Gryphon: I think this gfx looks too big and bulky to be a Gryphon. I am renaming this to Gargoyle Wings this can be the Gargoyle creature when it has been hit with a Fly spell. We still need a standard version without the wings and someone needs to design the stats and abilities of a Gargoyle creature. Wizard 4.incomplete: Why is this incomplete? Hmm... On the one hand I like it like it is On the other hand I like the current Wizard 4 flying around guy On the third hand the flying wizard guy could be a Genie of some sort. On the fourth hand this Wizard 4.incomplete looks like he is made of clay so I don't know what to do with him. Since Imbe says he is incomplete I will just put him into gfx/UnusedGfx/Imbe/ for now. INCLUDED These gfx: Alliance: I antialiased it a little bit and included it + sent it to Xav so he can manufacture a new Separation based on this. Wizard 1: Hopefully Xav can anti-alias the wand for me. :) Note to Imbe: What is that yellow stuff doing to him? It looks like his magic orb is attacking him. :) Or maybe his spell is backfiring on him? Wizard 2: Very nice! Very good rotation! Wizard 3: Very nice! Wizard 8: CowaFreakinBunga! I put the "old" Wizard 8 into gfx/UnusedGfx/Imbe/ just in case. I'm still deciding what to do with: Harpy: It looks very cool. But I'm unsure if this should be a Harpy or a Bird Lord or ??? Wizard 7: It looks great. But so does the current Wizard 7. What am I to do? CellEffect/heal.incomplete I like this. I am planning to use it for Heal, Recover Boost, Brain Boost, etc. {}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{} April 22, 2001: Today was the first day that I played Chaos on the A1200T AGA. Ack! 1. Hires monitor I've been playing Chaos on a 1084S monitor with .42mm dot pitch for years. The gfx look nice. But on my Commodore 1960 monitor with .28mm dot pitch the gfx look very bad. You can see each and every square pixel. Yuk. The AGA version FOR SURE needs 640x512 resolution to counteract this problem. 2. Sprite corruption For some reason loading Chaos corrupts the mouse sprite on all my other screens. I guess the OS can't handle 1 task using a lores sprite and another task using a hires sprite. It looks horrible! How do I fix this??? Or should I just wait till the game opens AGA screens and then the problem will automatically disappear? 3. The first time I load Chaos the intro screen is in NTSC, which is wrong. The next time I load Chaos the intro screen is in PAL. The intro screens are still being opened using the lame old OS 1.3 routines. I have now rewritten the intro screens to open using the OS 3.0 OpenScreenTags() like alll the other screens in the game. NOW FIXED. * Investigated other theoretical problems in JCsound but couldn't find anything wrong. * I did FD's suggestion to do the CloseDevice() related code in perfect reverse order. This didn't seem to make any actual difference but it might in the future and I added code to check for this and report any messages returned from CloseDevice() into T:JClogfile. April 23, 2001: * Spent all day talking to programmers about gfx card programming techniques and how to make programs residentable. It turns out that making a residentable program is TOTALLY EASY in SASC!!! But the only example resident program I had ever looked at was a real pain because everything had to be rewritten to a more complicated syntax. This example program was obviously made for use with inferior compilers. April 24, 2001: * I released v1.5 of JCsound with proper Stereophonic playback support and extra error checking and fully residentable for playtesting. * UPDATED Chaos to quit running JCsound from the RAM:c/ dir and to use the resident version instead. This saved 216 bytes on the size of the executable. JCSOUND RESIDENT ADVANTAGES: Loads faster! (Actually it doesn't load at all! It is already loaded!) Can run 4 copies of it at the same time without burning any extra code memory. * UPDATED the documentation to include info about the Blood option. April 25, 2001: * BUG: when creatures come into being who belong to a dead computer wizard, the human gets to control them! The computer should control these creatures! NOW FIXED. * ELIMINATED ram:ChaosDir/ It is no longer used. * MODIFIED the speech system with error checking similar to that used by JCsound then played half a test game. No bugs detected. But I did hear certain sound effects start with unsynchronized left/right channels. The speech sounded wierd a few times also. April 26, 2001: * AUTOSAVING is very fast on 50Mhz 060! * ENFORCER won't work on my 060!!!! Aaauuggh!!!! This sux! Chaos will start becoming very badly bugged without enforcer running! I assume this is caused by RemApollo. (?) * Multitasking speech added. When you click on a monster and speech is activated the speech plays in the background (asynchronously). I played a test game and it works perfectly. * BUG: After casting Seismology the Heal spell sets your feel range, smell range and hear range to 7.1! NOW FIXED. April 27, 2001: ------------------------------------------------------------------------ Robin's New CellEffects: CastFlames: Included as Fireball1. This is currently only used when casting a Fireball onto something. Should it be used for anything else? Its very long (over 100 frames) and I'm running out of chipram so I shortened it down to just a few frames. CastGfx: Looks wild! I must use this for something! But what? I'm putting it into UnusedGfx/Robin/ for the moment. CastGood: Included as DemonicDoorway. This is used when casting a demon/devil/higher devil/elemental. DemonID,DevilID,HDevilID,FDemonID,EFireID,EAirID,EWaterID,EEarthID, GrimReaperID CastRing: I'm including the Green one as Toxicity. This effect will be used by all the "Beam" spells. (Lethargy Beam, Toxicity Beam, etc.) All of them except Plasma Beam. There are many other nice looking CastRing fx! I don't know what to use the other castrings for!?!?! aaaahg! They are residing in UnusedGfx/Robin/ CastWarp: Included as UncertaintyAppearance (I can't think of anything else to call it.) I removed the ending frames. I antialiased the circles. This is now used by the Uncertainty spell when new creatures magically appear onto the board. This one worked out really well!!!! ------------------------------------------------------------------------- Put in Imbe's heal fx as "HealingSpell" for: Recover Boost Brain Boost Heal Magic Shield Any others? * Played a test game to test all the new cell effects. Everything seems to work perfectly. * There are now 2353 tiles in the game consuming 451K of chipram! That's just for the tiles! That doesn't count GUI images, sprites and screen mem. And remember I left out 80 of Robin's fire tiles to save 15K of chipram. This is a very good reason to start the AGA version development because the AGA version will store all tiles in fastram. April 28th, 2001: * I spent most of the day playing a full complete game of Chaos. I didn't win until turn 62. I played against 7 Ruthless computer wizards who were in an alliance against me in a dungeon of Force Walls with 4 generators and 10 scrolls. Exploration mode was off. It was really hard. They kept ganging up on me. 2 Wizards on the opposite side of the board from me kept casting horrible spells against me because one had an Oracle and the otherer had Depth! I had no way to stop them! I lost a LOT of creatures in this game!!! One time they cast Ditzy Blonde on my undead Emerald Dragon. I just _knew_ they were going to cast subversion on it the next turn so I had to cast Brain Boost on my Emerald Dragon. And sure enough, as soon as I clicked on my Emerald Dragon and the gfx effect was over, the evil enemy wizard tried to subvert my Emerald Dragon!! Its been months since I bothered to cast a Brain Boost; I'm really glad I did this time! I won with 1972 points. The opposing team had about 2500 points. They killed a lot of stuff including many Force Walls. The sounds acted strange sometimes; sometimes the sound would start playing on the left and the right but then one channel would stop partway through and only the other channel would play the rest of the way. I have no idea how this can be possible. No real bugs to report. April 29th, 2001: ************************************************************************ 100% TRANSLATIONS UPGRADE ************************************************************************ I was originally going to have lists with "M" and "F" variations but I think there is a shortcut if we use "" for male and "e" for female. This will shorten and simplify the catalog lines. If you don't like it then you can make your own system. This is just an example of 1 possible way to do things. I'm sure there are many other ways that are just as good, or better, than this way. PERFECT FRENCH TRANSLATIONS!!!!!!!!!!!!!!!!! BEGIN_LIST {GENDEROFLoup} * BEGIN_LIST {GENDEROFHarpie} e * BEGIN_LIST {SUBJECTGENDER} Le * BEGIN_LIST {OBJECTGENDER} un * BEGIN_LIST {SUBJECTGENDERe} La * BEGIN_LIST {OBJECTGENDERe} une * {SUBJECTGENDER{GENDEROF%2$s}} %2$s de %$1s est promu{GENDEROF%2$s} en {OBJECTGENDER{GENDEROF%3$s}} %3$s BEGIN_LIST {dissous} dissous * BEGIN_LIST {dissouse} dissoute * In French you could return "e" for female and "" for male (GENDEROF function). This would be a shortcut. In this way you don't have to list EVERY verb into the talklists file, only the "irregular" ones. THIS PROPOSAL REQUIRES: 1. NULL lists MUST be handled properly! They should return a pointer to a NULL string! (first byte of the string is 0) DONE. 2. There is a bug in OS RawDoFmt() which means that you cannot supply a format string which only uses some of the format paramters! Tsprintf(text_store, "%1$s %2$s","P1","P2","P3"); freaks out and doesn't work! I found this out when working on Robin's scavenging texts. One of his paramters (%3$s) is NOT in the orignal catalog file! It is contained in the talklist file! This SHOULD work perfectly but it doesn't. I hacked around this bug by simply doing ReplaceLists() first then plugging in the parameters. 3. Strangely you can supply the same parameter over and over as in: Tsprintf(text_store,"%1$s %3$s %3$s %2$s %1$s","J1","J2","J3"); I tested this a few different times and it always seems to work. 4. I modified ReplaceLists() to 100% handle nested lists. 5. The code in Chaos that builds the spell description lists must also build a talklist file with all creatures and genders. This file is stored in the TalkListsDir/ DONE. 6. Add in some code to read the gender byte from description files. If there is no gender byte just assume NULL. ("") DONE. For some reason I coded this in such a way that the gender info can only be 1 byte. This byte may be omitted. If this is a problem then let me know. 365 different BEGIN_LIST {GENDEROFSnake} e * BEGIN_LIST {GENDEROFGreen Dragon} * PLEASE NOTE: In order for this new fancy perfect translations thing to work I must add a hunk of code to each individual place in the program that makes use of it. At the moment I have only added this code to the scavenging string (Line 49). Once someone has tested this new system and verified that it actually works then I can add the code hunk to all the other needed catalog lines. This code hunk uses a variable number of parameters and I have no idea how to code a routine to work with it. I'm not sure it is possible to reduce this into a subroutine. Perhaps Sean should look at this. ************************************************************************ END 100% TRANSLATIONS UPGRADE ************************************************************************ April 30, 2001 I downloaded Multiplayer and Hippoplayer from Aminet then I listened to each protracker song to figure out if it was messed up or not. The problem is that the protracker replay routine in Chaos is _VERY_ old and it is not 100% 060 compatible because it doesn't wait long enough after issuing a write to the audio hardware for it to take effect. The easy solution is simply to convert any wrong-sounding protracker mods to med format: 1 17 is messed up around 34-36 convert it! This mod somehow shrank from 406K->401K when I converted it to MMD1 format. Strange. 20 is messed up! 21 is messed up at pattern 30!! 23 is messed up in the beginning and all over! 32 is messed up at the end (fade out doesn't fade out). 36 I think is messed up in patterns 4-6 the "wooh" instrument isn't fading out? I'm not sure about this. I'll just convert it to be safe. This reduced the filesize from 292K->284K. Strange. 37 is messed up right from the beginning. 40 is messed up an instrument doesn't fade out correctly. Then around 5 it messes up really badly! 51 is totally messed up! Convert this to med then TEST IT! 58 fades in all wrong and sounds terrible! 59 is messed up. I installed OctaMed SoundStudio Professional v1.03c onto the A1200T to convert the mods. All above mods converted and tested. NOW FIXED. 41 WHAT THE HELL!?!? This is the artifact/scavenging music but its in protracker format with no subsongs!?!?!? Recover this from my A3000!!!! Find #42 in an old version! DONE. FIXED. Test if Subsongs work correctly now that I have fixed JCsound (?) Luckily I left all the old subsong/jcsound testing code in the game but commented out. I will just uncomment it now and give it a whirl. Hmmm... well... Sometimes the ghost sound starts out VERY unsynchronized immediately after playing a subsong. But no permanent damage seems to be done. * RISKY MANEUVER: I am taking out the hacked code to work around the "subsong followed by JCsound crashes bug" since it seems to work ok now. This will solve the glitchy sound at the end of every subsong. Subsongs are only used for scavenging and artifact changing. * Updated the credits section of the docs. May 2, 2001: * Conduct a test: Run the ElboxVirge cybergraphics driver then play Chaos and load and save the game to see if everything works or not. It seems to work ok but I didn't play very long. * Included Imbe's Harpy. * BUG: The new 100% translations code is crashing when I select a nonexistent language such as Italiano. NOW FIXED. * Compiled version 3.3. Main executable = 434552 bytes. * Updated the ChaosHeavy.readme and sent it off to be translated. Thursday May 3, 2001: WILD stuff on the news today!!!!!!!!! * Included Artur's new Polski SetupScreen2.iff and Polski.catalog.